一. 前言
二. 更加简单的存储和使用Bean对象
- 类注解
- 方法注解
三. 获取Bean对象(对象装配)
- 属性注入
- Setter注入
- 构造方法注入(官方推荐)
一.前言
创建 Spring 项目
创建项目 ---> 存储Bean对象 ---> 取出Bean对象
然后,配置xml,添加Spring 依赖
每次,这样存储Bean对象,比较麻烦,所以,引入注解,来帮我们减轻负担
二 . 添加存储对象的注解
1. 类注解
- Controller 控制层 (前端参数检验合法性)
- Service 服务层 (数据的组装和接口的调用)
- Repository 数据持久层 (负责与数据库进行交互)
- Component 组件 (工具类)
- Configuration 配置层 (系统运行前,提前加载资源)
添加注解演示
@Controller
public class UserController {
public void say(){
System.out.println("hello Controller");
}
}
取Bean对象
public class Application {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//bean id为类名改写为小驼峰方式
UserController userController = context.getBean("userController",UserController.class);
userController.say();
}
}
其他 四种添加注解方式相同
这里强调一下 类注解Bean对象的命名规则
1. 命名的id 首字母大写,则采用小驼峰的格式,变成小写模式
2. 命名的id 前两个字母都是大写,则不改变格式,直接用原id
规则很简单,原因就是idea 的源码
既然,使用方法相同,为什么要用五个类注解,一个不就好了吗? 一劳永逸
存在必有价值,所以,到底是为什么呢?
让程序员看到注解,就知道当前类的用途
这里给大家举个例子
就好比我们看一本书时,每一章的标题,让我们可以大概知道这一章节给读者描述了发生了什么
2.方法注解
@Bean注解加到方法上,将方法的返回值添加到容器中
注意: @Bean注解必须结合五大类注解来使用,并且方法必须有返回值
代码示例
@Controller
public class Student {
@Bean("lover")
public StudentDemo lover(){
StudentDemo student = new StudentDemo();
student.setName("恩恩");
return student;
}
}
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
StudentDemo student = (StudentDemo) context.getBean("lover");
System.out.println(student.getName());
}
运行结果
三 . 获取Bean对象(对象注入)
- 属性注⼊
- 构造⽅法注⼊
- Setter 注⼊
1. 属性注入
@RestController
public class UserController {
// 属性对象
@Autowired
private UserService userService;
public UserInfo add(String username) {
return userService.add(username);
}
}
优点:
- 属性注入最大的优点就是实现简单、使用简单
缺点:
- 功能性问题:无法注入一个不可变的对象(final 修饰的对象);
- 通用性问题:只能适应于 IoC 容器;
- 设计原则问题:更容易违背单一设计原则。
2. 构造方法注入
构造⽅法注⼊是在类的构造⽅法中实现注入
如果当前类中只存在一个构造方法的话,那么@Autowired可以省略,多个构造方法时
则不可以省略
@RestController
public class UserController {
// 构造方法注入
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
优点:
- 通常 Setter 只注入 set 一个属性,更符合单一设计原则
缺点:
- 无法注入final修饰的变量
- Setter 注入的对象可以被修改
3. Setter 注入
@RestController
public class UserController {
// Setter 注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
}
优点:
- 1. 可以注入被final 修饰的变量
- 2. 注入的对象不会被修改
- 3.构造方法注入可以保证注入对象完全初始化
- 4.构造方法注入通透性比较好
缺点:
- 1.用法比较复杂
- 2.无法解决循环依赖问题
4. @Resource 另一种注入关键词
@Autowired与@Resource区别
- 出身不同:@Resource来自于jdk,@Autowired时Spring框架提供的
- 用法不同:@Autowried可以用于属性注入,构造方法注入,Setter注入,@Resource不支持构造方法注入
- 参数不同:@Resource支持更多的参数设置,比如name,type,而@Autowried只支持required参数
- 精确的描述bean的名称(将注入的名称写对)
- 使用 @
Rsource 设置 name
方式来重命名注入对象 - 使用@
Autowired + @Qualifier
来筛选bean对象
1 . 使用@Rsource ( name = xxx)
@Controller
class UserController {
// 注⼊
@Resource(name = "user1")
private User user;
public User getUser() {
return user;
}
}
2. 使用 @Qualifier
@Controller
public class UserController {
// 注⼊
@Autowired
@Qualifier(value = "user2")
private User user;
public User getUser() {
return user;
}
}