1. 依赖注入的3种方式
1.1. Set方法注入
public class Address {
private String city;
private String street;
//属性必须有对应的set方法
public void setCity(String city) {
this.city = city;
}
public void setStreet(String street) {
this.street = street;
}
}
<bean id="addr1" class="com.entity.Address">
<!-- name 属性名 value 属性值 -->
<property name="city" value="上海"></property>
<property name="street" value="浦东"></property>
</bean>
1.2. 构造方法注入
public User(String uname, Address address) {
super();
this.uname = uname;
this.address = address;
}
<!-- 使用构造方法配置bean -->
<bean id="addr" class="com.entity.Address">
<property name="city" value="上海" />
<property name="street" value="商城路" />
</bean>
<bean id="u2" class="com.entity.User" >
<!-- index 构造方法的参数索引号,从0开始 -->
<constructor-arg index="1" ref="addr" ></constructor-arg>
<constructor-arg index="0" value="张学友"></constructor-arg>
</bean>
1.3. 静态工厂注入
AddressFactory类中的代码
public static Address createAddress(){
return new Address("上海","黄埔");
}
<!-- 静态工厂注入bean
factory-method 创建对象的静态方法
-->
<bean id="f" class="com.entity.AddressFactory" factory-method="createAddress" ></bean>
<bean id="u3" class="com.entity.User" >
<property name="uname" value="郭富城"></property>
<!-- 引用之前配置的静态工厂对象的id,实现创建User类下的Address对象 -->
<property name="address" ref="f"></property>
</bean>
2. ApplicationContext事件
2.1. ApplicationContext事件机制是观察者设计模式的实现
2.2. 通过ApplicationEvent类和ApplicationListener接口实现
2.3. ApplicationEvent:容器事件,定义被监听的事件内容
2.4. ApplicationListener:监听器,指定负责监听的对象
3. Spring注入各种类型的对象
User类中的代码
private String[] names;
private Address[] addrs;
private List<Address> addrList;
private Map<Integer,Address> addrMap;
private Set<Address> addrSet;
配置文件
<bean id="addr1" class="com.entity.Address">
<property name="city" value="上海"></property>
<property name="street" value="浦东"></property>
</bean>
<bean id="u4" class="com.entity.User">
<!-- 数组 -->
<property name="names">
<list>
<value>jack1</value>
<value>jack2</value>
<value>jack3</value>
</list>
</property>
<!-- 对象数组 -->
<property name="addrs">
<list>
<ref bean="addr1" />
<ref bean="addr2" />
</list>
</property>
<!-- 对象集合 -->
<property name="addrList">
<list>
<ref bean="addr2" />
<ref bean="addr3" />
</list>
</property>
<!-- map集合 -->
<property name="addrMap">
<map>
<entry key="1" value-ref="addr1" ></entry>
<entry key="3" value-ref="addr3" ></entry>
</map>
</property>
<!-- set集合 -->
<property name="addrSet">
<set>
<ref bean="addr1" />
<ref bean="addr2" />
</set>
</property>
</bean>
4. 自动装配
4.1. Autowired:配置文件bean节点的属性,自动注入当前bean所依赖的对象属性
public class User{
Private Address addr;
}
<bean id=”user” class=”com.entity.User” autowire=”byName” ></bean>
4.2. Autowired属性有4个属性值
4.3. byName:如果当前bean对象所依赖的属性对象在配置文件中已经配置,且id的名称与bean对象的子对象的属性名相同,则spring自动装配
public class User{
Private Address addr;//与spring配置文件中注入的Address类的id一致
}
<bean id=”addr” class=”com.entity.Address” ></bean>
<bean id=”user” class=”com.entity.User” autowire=”byName” ></bean>
4.4. byType:如果当前bean对象所依赖的属性对象在配置文件中已经配置,且类型与bean对象所依赖的子对象的类型一致,则spring自动装配
public class User{
//与spring配置文件中注入的Address类的id可以不一致,
//因为spring配置byType后,根据类型查找可以注入的子对象
Private Address abcd;
}
<bean id=”addr” class=”com.entity.Address” ></bean>
<bean id=”user” class=”com.entity.User” autowire=”byType” ></bean>
如果配置文件中存在2个或2个以上的同类型的bean,则spring报错
5. 使用spring配置文件方式整合项目
5.1. Jar包
5.2. 数据库访问层
5.2.1. 接口与接口的实现类与JavaEE项目相同
5.2.2. 数据库帮助类的配置方式
5.2.2.1. 由于实际开发中,经常切换数据库,则使用读取资源文件的方式加载登录数据库的用户名,密码和驱动类
5.2.2.2. 创建资源包resources文件夹,存放所有的配置文件(spring-common.xml,jdbc.properties)
5.3. 服务层:调用数据库访问层代码,实现业务功能
5.4. Spring配置
5.4.1. 配置bean,注入数据库访问层对象,UserDaoImpl类
5.4.2. 配置bean,注入服务层对象,UserService类
5.4.3. 使用自动装配,让spring为UserService对象自动注入所依赖的UserDaoImpl
5.5. 编写测试类
5.5.1. 创建ApplicationContext对象,获取服务层的对象,调用添加方法
6. 使用注解方式自动装配
6.1. 在UserDaoImpl类中配置@Repository("userDao"),相当于配置文件中注入了UserDaoImpl对象,且id=”userDao”
6.2. 在UserService类中配置@Service("userService"),相当于配置文件中注入了UserServic对象,且id=”userService”
6.3. Spring配置文件中注入的所有bean都可以省略,
6.4. 添加context节点,让所有写有spring注解的类生效:
<context:component-scan base-package="com.a,com.b"></context:component-scan>