Spring 依赖注入几种方式 (四)
依赖注入几种方式
常用的通过set方法注入
<bean id="userDao" class="com.matrix42.dao.UserDao"></bean>
<bean id="userService" class="com.matrix42.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userAction" class="com.matrix42.action.UserAction">
<property name="userService" ref="userService"></property>
</bean>
内部bean
当创建的对象不被容器其他地方引用的时候,可以这样写;这样写不通用,内部对象只能被使用一次
外部bean是单例内部就是单例,外部bean是多例内部就是多例,里面配置scope不生效
<bean id="userAction" class="com.matric42.UserAction">
<property name="userService">
<bean class="com.matrix42.userService">
<property name="userDao">
<bean class="com.matrix42.UserDao"></bean>
</property>
</bean>
</property>
</bean>
p 名称空间
在beans里加入p名称空间
xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.matrix42.User" p:id="1000" p:name="Jack"></bean>
#也可以用ref(p:nane-ref)
自动装配(了解)
<bean id="userService" class="com.matrix42.UserService" autowire="byName"></bean>
autowire="byName"根据set方法的名字自动在容器中寻找对应的对象
autowire="byType"根据类型自动在容器中寻找对应的对象,要确保对象唯一否则会报错
在xml头中写xdefault-autowire="byType" 全局自动装配设置
简化配置但是维护麻烦
注解
<context:componet-scan base-package="com.matrix42"></context:componet-scan>
@Componet("userDao")
@Scope("prototype")
//相当于<bean id="userDao" class="...">
public class UserDao{
public void save(){
System.out.println("UserDao.save()");
}
}
public class UserService {
private UserDao userDao;
//根据名称去ioc容器找对象,找到后注入当前方法
@Resource(name = "userDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.save();
}
}
可以使用@Repository(),@Service(),@Controller()代替Componet()区分它是MVC三层框架的那一层
持久层 业务逻辑层 控制层
可以使用@Repository等,默认名称是类名,且第一个字母小写
简化
public class UserService {
//根据名称找,再根据类型找
@Resource
private UserDao userDao;
public void save() {
userDao.save();
}
}
使用代码进行依赖注入
使用容器类AnnotationConfigApplicationContext
构造方法可以是类对象,包名等
配置java类使用@Configuration注解,方法使用@bean
@Configuration
public class Config {
@Bean
public User getUser(){
User u = new User();
u.setId(1);
return u;
}
}
public class UserTest {
@Test
public void testUser(){
//创建容器对象
//ApplicationContext ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
//destory()方法在实现类中才有
// FileSystemXmlApplicationContext ac = new FileSystemXmlApplicationContext("src/applicationContext.xml");
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext ("com.matrix42.config");
System.out.println("----------------------");
User u = ac.getBean(User.class);
//销毁容器实例
ac.destroy();
}
}
配置方式与注解方式比较
-
配置
便于维护,配置过多,比较繁琐
-
注释
开发方便,简化配置,不利于后期维护,如果修改对象创建,关系处理,需要修改代码