目录
1.存储 Bean 对象
1.1 前置⼯作:配置扫描路径(重要)
1.2 添加注解存储 Bean 对象
1.2.1.@Controller[控制器]
1.2.2 @Service[服务]
1.2.3 @repoistory[仓库]
1.2.4 @Configuration[配置]
1.2.5 @Component[组件]
1.3为什么要这么多类注解?
1.3.1 类注解之间的关系
1.3.2 Bean 命名规则
1.4通过@Bean方法注解
1.使用
2.重命名Bean
2.获取 Bean 对象(对象装配)
2.1 3种注入方式
1. 属性注⼊
2. 构造⽅法注⼊
3. Setter 注⼊
4.三种注入方式优缺点分析
2.2 2种注入方法
1.@Autowired
2.@Resource
3.@Autowired 和 @Resource 的区别
3.@Bean把一个类型的对象注入多次的问题
1.存储 Bean 对象
1.1 前置⼯作:配置扫描路径(重要)
注意:想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
在 spring-config.xml 添加如下配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.beans"></content:component-scan>
</beans>
1.2 添加注解存储 Bean 对象
想要将对象存储在 Spring 中,有两种注解类型可以实现:
1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
2. ⽅法注解:@Bean
使用五大类注解实现
注:1.加类注解
2.要放到配置文件的目录下
1.2.1.@Controller[控制器]
package com.beans;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
public void sayHi(){
System.out.println("UserController");
}
}
1.2.2 @Service[服务]
@Repository
public class UserRepository {
public void sayHi(){
System.out.println("UserRepository");
}
}
1.2.3 @repoistory[仓库]
@Repository
public class UserRepository {
public void sayHi(){
System.out.println("UserRepository");
}
}
1.2.4 @Configuration[配置]
@Configuration
public class UserConfig {
public void sayHi(){
System.out.println("UserConfig");
}
}
1.2.5 @Component[组件]
@Component
public class UserComponent {
public void sayHi(){
System.out.println("UserComponent");
}
}
1.3为什么要这么多类注解?
提高代码可读性,可以判断当前类的用途
@Component
@Configuration:配置层
@Controller:控制层(前端参数校验)
@Service:服务器(数据的组装和接口调用)
@Repository:持久层(负责和数据库交互)
1.3.1 类注解之间的关系
其实这些注解⾥⾯都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“⼦类”
1.3.2 Bean 命名规则
第一个大写,第二个小写,返回时第一个改为小写
第一二个都是大写,则返回原类名
1.4通过@Bean方法注解
1.使用
必须搭配类注解使用.命名是方法的名称
@Component
public class UserBean {
@Bean
public User user1(){
User user=new User();
user.setUserId(1);
user.setUsername("zhang");
return user;
}
}
public class APP {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
User user=context.getBean("user1",User.class);
System.out.println(user);
}
}
2.重命名Bean
命名规则:
- 当没有设置name属性时,bean默认的名称是方法名
- 设置了name属性时,通过重命名的name属性对应的值来获取
设置name属性给Bean对象命名可以取多个名字
@Component
public class UserBean {
@Bean(name = {"userinfo","user1"})
public User user1(){
User user=new User();
user.setUserId(1);
user.setUsername("zhang");
return user;
}
}
名字要对应
2.获取 Bean 对象(对象装配)
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。
2.1 3种注入方式
1. 属性注⼊
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
2. 构造⽅法注⼊
要加构造方法
@Service
public class UserService {
public void sayHi(){
System.out.println("UserService");
}
}
@Controller
public class UserController2 {
private UserService userService;
public UserController2(UserService userService){
this.userService=userService;
}
public void sayHi(){
userService.sayHi();
}
}
3. Setter 注⼊
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注
解
@Service
public class UserService {
public void sayHi(){
System.out.println("UserService");
}
}
public class UserController4 {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService=userService;
}
public void sayHi(){
userService.sayHi();
}
}
4.三种注入方式优缺点分析
- 属性注入:
- 优点:简洁使用方便
- 缺点:只能用ioc容器,也可能出现空指针异常
- 构造方法注入:Spring推荐的注入方式
- 缺点:如果有多个注⼊会显得⽐较臃肿
- 优点:通用性,保证注入不为空
- setter注入:Spring早期推荐方式
- 缺点:通用性不如构造方法
2.2 2种注入方法
1.@Autowired
@Controller
public class UserController3 {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService=userService;
}
public void sayHi(){
userService.sayHi();
}
}
2.@Resource
@Controller
public class UserController3 {
private UserService userService;
@Resource
public void setUserService(UserService userService){
this.userService=userService;
}
public void sayHi(){
userService.sayHi();
}
}
3.@Autowired 和 @Resource 的区别
1.出身不同:@Autowired来自于Spring,@Resource来自于JDK注解
2.用法不同:@Autowired可以用于三种注入方式,@Resource不能用于构造函数注入
3.参数不同:@Autowired只支持requierd设置,@Resourcd可以设置更多的参数,例如name设置根据名称获取 Bean;type设置
3.@Bean把一个类型的对象注入多次的问题
方法:
1.精确描述bean名称
2.使用@Resouce设置name方式来重命名注入对象
@Resource(name="user")
3.用@Autowired+@Qualifier来筛选bean对象
@Autowired
@Qualifier(value="user1")
private User user;