1对象装配(依赖注入)
1.1.属性注入(实际开发中使用最多的,但不被官方推荐)
根据类型查找
@Autowired
private UserService userService;
1.2.Setter注入
private UserService us;
@Autowired
public void setUs(UserService us) {
this.us = us;
}
1.3.构造函数注入
一个类默认有一个无参的构造函数,当我们写了有参的构造函数的时候,就没有这个默认无参构造函数了。
创建对象时,需要调用构造函数。
当前存在多个构造函数,Spring就不知道使用哪个了,我们需要使用@Autowired
1.4优缺点分析
属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常),不能注入final修饰的属性。
Setter方法注入的优点:方便在类实例之后,重新对该对象进行配置或者注入。缺点:不能注入一个final修饰的属性;注入对象可能会被改变,因为setter方法可能会被多次调用,就有被修改的风险。
构造函数注入的优点:可以注入final修饰的属性;注入的对象不会被修改;依赖对象在使用前一定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法;通用性好,构造方法是JDK支持的,所以更换任何框架,他都是适用的。缺点:注入多个对象时,代码会比较繁琐。
1.5@Resource
@Controller
public class UserController4 {
@Resource
private UserService us;
@Resource(name = "user")
private User user2;
public void sayHi(){
us.doService();
System.out.println(user2.getName());
System.out.println("hi,controller4");
}
}
@Autowired和@Resource的区别:
出身不同:@Autowired来自于Spring,而@Resource来自于JDK 的注解;
使用时设置的参数不同,相比于@Autowired来说,@Resource支持更多的参数设置,例如name设置,根据名称获取Bean。
@Autowired可用于属性注入、Setter注入和构造函数注入,而@Resource只能用于属性注入和Setter注入,不能用于构造函数注入。
1.6同一个类型多个@Bean报错
public class BeanConfig {
@Bean
public Integer age(){
return 11;
}
// @Bean(name={"aaa","user"})
@Bean
public User user(Integer age){
User user=new User();
user.setName("张三");
user.setAge(age);
return user;
}
@Bean
public User user1(){
User user=new User();
user.setName("李四");
user.setAge(18);
return user;
}
}
这个程序执行会报错,报错的原因是非唯一的Bean对象。
处理方法:
使⽤ @Resource(name="user1") 定义。
使⽤ @Qualifier 注解定义名称。
①使⽤ @Resource(name="XXX")
@Controller
public class UserController4 {
@Resource
private UserService us;
@Resource(name = "user")
private User user2;
public void sayHi(){
us.doService();
System.out.println(user2.getName());
System.out.println("hi,controller4");
}
}
②使用@Qualifier
@Controller
public class UserController {
@Autowired
private UserService us;
@Autowired
@Qualifier(value = "user")
private User user2;
public void sayHi(){
us.doService();
System.out.println(user2.getName());
System.out.println("hi,controller");
}
}