注入类型
1.构造方法注入
创建构造方法
public UserService(UserDAO userDAO) {
super();
this.userDAO = userDAO;
}
构造方法注入xml配置
<bean id="u" class="com.login.dao.impl.UserDAOImpl">
<bean id="userService" class="com.login.service.UserService">
<constructor-arg>
<ref bean="u"/>
</constructor-arg>
</bean>
2.set注入
拥有set方法
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
set方法注入xml配置
<bean id="u" class="com.login.dao.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.login.service.UserService">
<property name="userDAO" ref="u"></property>
</bean>
id name
name也可以表示id,但是name中可以包含特殊字符。
简单属性注入
UsersDAOImpl中有两个属性daoId和daoStatus,配置xml给属性注入值。
<bean id="u" class="com.login.dao.impl.UserDAOImpl">
<property name="daoId" value="8"></property>
<property name="daoStatus" value="good"></property>
</bean>
Beans的生命范围(Scope)
在xml中可以配置bean标签中的scope值设置范围。
scope取值:singleton(单列)
prototype(每次创建新的对象)
<bean id="userService" class="com.login.service.UserService" scope="prototype">
<property name="userDAO" ref="u"></property>
</bean>
集合注入
创建map list set 属性。
private List<String> lists;
private Set<String> sets;
private Map<String,String> maps;
配置xml
<bean name="userDao" class="com.login.dao.impl.UserDAOImpl">
<property name="sets">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
<property name="lists">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="maps">
<map>
<entry key="1" value="1"></entry>
<entry key="2" value="2"></entry>
<entry key="3" value="3"></entry>
</map>
</property>
</bean>
自定注入
spring中的autowire可以实现自动注入,在bean标签中设置autowire的值。
autowire的取值:
byname根据UserService类中属性名(所以bean中的id的一致)
byType根据bean中的class。(不能有相同的class)
<bean id="userService" class="com.login.service.UserService" autowire="byName">
</bean>
生命周期
实例化 -> 属性赋值 -> 初始化 -> 销毁。
UserService类
package com.login.service;
import com.login.dao.UserDAO;
import com.login.model.User;
public class UserService {
private UserDAO userDAO ;
public void init(){
System.out.println("init");
}
public UserService(UserDAO userDAO) {
super();
this.userDAO = userDAO;
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public void add(User u){
userDAO.save();
}
public void destroy(){
System.out.println("destroy");
}
}
配置xml
<bean id="userService" class="com.login.service.UserService" init-method="init" destroy-method="destroy">
<constructor-arg>
<ref bean="u"/>
</constructor-arg>
</bean>
Test
@Test
public void testAdd() throws Exception {
ClassPathXmlApplicationContext apc = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService) apc.getBean("userService");
UserService service2=(UserService) apc.getBean("userService");
System.out.println(service==service2);
}
Console
输出true,默认情况下创建的bean是同一个
init
true
destroy