前言:
今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员
个人主页⭐: 书生♡
gitee主页♂:奋斗的小白
博客领域:java编程 ,前端,算法,强训题目
写作风格:超前知识点,干货,思路讲解,通俗易懂
支持博主:关注⭐,点赞、收藏⭐、留言
我们之前的博客讲述了如何通过注解(类注解和方法注解)简单的读取和存储Bean对象
类注解和方法注解的博客地址 :博客链接
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊
现实工作中一般是将,将 Service 类注⼊到 Controller 类中。
我们获取Bean有三种方法,分别是属性注入,set注入,构造方法注入,下面为大家挨个分享一下。
属性注入我们也是通过注解实现的,通过@Autowired来实现的
通过这个@Autowired注解,我们就可以将Service类注入到Controller类中。
@Service
public class StudentService {
public void hello()
{
System.out.println("Hi,Service。");
}
}
@Controller
public class StudentController {
//获取 Bean 对象=>属性注入
@Autowired
private StudentService studentService;
public void hello()
{
studentService.hello();
}
}
public static void main(String[] args) {
//1.获取Spring对象(上下文)
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
//2.取出bean对象
StudentController student =context.getBean("studentController",StudentController.class);
student.hello();
}
属性注入优点:
1.实现简单
属性注入缺点:
1.不能注入不可变的对象(对象被final修饰的)
2.只适用于Ioc容器
3.更容易违背单一设计原则(针对的是类)
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注
解
//获取 Bean 对象=>set注入
private StudentService studentService;
@Autowired
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
public void hello()
{
studentService.hello();
}
set注入优点:
1.更加符合单一设计原则。针对对象方法级别。
set注入缺点:
1.不能注入不可变对象;
2.注入对象可被修改。(set方法是普通set方法,可以被重复调用,在被调用时就存在修改的风险。)
构造⽅法注⼊是 Spring 推荐的注⼊⽅式
构造⽅法注⼊是在类的构造⽅法中实现注⼊
//构造⽅法注⼊
private StudentService studentService;
@Autowired
public StudentController(StudentService studentService, UserComponent userComponent) {
this.studentService = studentService;
this.userComponent = userComponent;
}
public void hello()
{
studentService.hello();
}
如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略
构造方法注入优点:
1.可以注入一个不可变的对象。
2.注入的对象不会被修改。
2.1加了final修饰符。
2.2构造方法是随着类加载只执行一次的(不像set有可能执行多次被修改的分享)。
3.注入的对象会被完全初始化。(使用构造方法带来的优点)
4.通用性更好。
构造方法注入缺点:
1.没有属性注入实现简单。
在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊
@Resource
private Student student;
public void hello()
{
System.out.println(student.toString());
}
相同点:
1.都是用来实现依赖注入的。
不同点:
1.功能支持不同:@Autowired支持属性注入、setter注入、构造方法注入;@Resource支持属性、setter注入,但不支持构造方法注入。
2.出身不同:@Autowired来自Spring框架;而@Resource来自于JDK。
3.参数支持不同:@Resource支持更多的参数设置比如name参数;而@Autowired只支持required 参数。
看这么一个代码
@Controller
public class UserBean {
@Bean
public User user1()
{
User user=new User();
user.setId(1);
user.setName("张三");
user.setPassword("123");
return user;
}
@Bean
public User user2()
{
User user=new User();
user.setId(1);
user.setName("张三");
user.setPassword("123");
return user;
}
}
@Controller
public class UserController {
@Autowired
private User user;
public void getUser()
{
System.out.println("user:"+user);
User user2=user;
user2.setName("lisi");
System.out.println("user:"+user2);
}
}
报错的原因是,⾮唯⼀的 Bean 对象。
解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
使⽤ @Resource(name=“user1”) 定义。
使⽤ @Qualifier 注解定义名称。
- 将对象存储到 Spring 中:
1.1. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component
1.2. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
- Bean 的命名规则:
⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
- 从 Spring 中获取对象:
1.属性注⼊
2.Setter 注⼊
3.构造函数注⼊(推荐)
- 注⼊的关键字有:
1.@Autowired
2.@Resource
- @Autowired 和 @Resource 区别:
1.出身不同;
2.使⽤时设置参数不同 @Resource ⽀持更多的参 数,⽐如 name。
- 解决同⼀类型多个 Bean 的报错:
1.使⽤ @Resource(name=“”)
2.使⽤ @Qualifier(“”)