Spring概述&XML配置
- 框架
- 表示层(控制) 业务层 持久层 数据库
- servlet+jsp service dao mysql
- struts2,springMVC spring mybatis,hibernate
- Spring是一个一站式的框架;主要的思想有IOC,AOP;整合能力非常强大
- IOC:反转控制,管理组件和组件之间的依赖关系
- AOP:面向切面编程,把分散在各个模块中的相同的功能点拿出来,然后写一个,谁用就插在哪即可
- Spring特点:
- 轻量级:非侵入式的:pojo;plain old java object;基于Spring开发的应用中的对象可以不依赖于Spring的API
- 依赖注入:DI(跟IOC是一个东西,相对IOC而言这种表述更直接);组件间关系由第三方维护
- AOP
- 容器:Spring本身是一个容器(工厂),负责创建所有的对象及对象间关系
- 一站式:什么都能做
- 使用Spring开发第一个 Hello World
- 创建一个 maven 工程
- 加入 spring-context 依赖
- 在 pom 文件中增加编译插件
- <build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- <build>
- 新建核心配置文件applicationContext.xml
- 在核心配置文件中创建对象
- 编写测试类,创建工厂并获得对象
- 在一个类有多个对象的情况下获得对象不可取class而是要取id,但是要强制转换
- 例:
- 上图创建了同一个武器类的两个武器对象,此时不能再用class获取了: Weapon w1 = (Weapon)factory.getBean("spear");
Weapon w2 = (Weapon)factory.getBean("knife");
- 在一个类有多个对象的情况下获得对象不可取class而是要取id,但是要强制转换
- IOC思想案例(反转控制;对象与对象之间的依赖关系不由任何一方控制,而是由第三方(IOC容器)控制)
- 在核心配置里直接给张飞配上一把武器(DI,依赖注入;第三方把武器注入给人;解耦),代替在测试类使用p.setWeapon()方法
- 上图 ref 用来引用其他的 bean,值为其他 bean 的 id
- test类直接调用p.attack()(Person类里有方法attack),而不需要先 set 了。
- 在核心配置里直接给张飞配上一把武器(DI,依赖注入;第三方把武器注入给人;解耦),代替在测试类使用p.setWeapon()方法
- bean 标记
- 作用:创建一个对象
- id:对象的唯一标识,不能重复,如未指定则默认使用类名作为id名
- name:对象名,可以有多个,用 "," 隔开
- Spring 容器
- BeanFactory 接口:基本接口
- ApplicationContext:应用上下文接口,BeanFactory 的子接口
- ClassPathXmlApplicationContext 类:从类路径中加载配置文件的容器;增加了refresh与close方法
- 依赖注入的方式
- 属性注入(调用 setter 方法;最常用)
- <property name="name" value="张飞"></property>
<property name="age" value="18"></property>
<property name="weapon" ref="spear"></property> - 注:CDATA节:原样输出
- <property name="name" value="张飞"></property>
- 构造器注入(调用构造方法)
- 首先对应的 vo 要有带参数的构造方法
- type 用于有构造器重载时(多个构造器)
- 如图里面仍有 property 标签,说明可以混合使用
- 工厂(不推荐)
- 属性注入(调用 setter 方法;最常用)
- 内部 bean:可以在property属性中定义一个内部bean,这个bean只能在创建它的外部bean中使用: <property><bean></bean></property>
- null 标签:在有默认值的类时,若想得到null,可这样操作: <property><null></null></property>
- 集合之数组(Person类新增数组hobby)
- List(Person类新增List:skill)
- Set(Person类新增set<Weapon>:ws)
- Map(Person类新增map:score)
- 未完待续 ...