Spring中,提供了注解来更简单的存储和读取对象。
一、存储Bean对象
1、配置扫描路径
<?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">
<!-- <bean id="user" class="User"></bean>-->
<content:component-scan base-package="com.demo.component"></content:component-scan>
</beans>
base-package中存放的是spring中的Bean的根路径
2、添加注解存储Bean对象
2.1方式一:五大类注解
通过五大类注解,可以了解当前类的用途。
2.1.1 @Controller 控制器存储
Controller归属于业务逻辑层,用来控制用户的行为,它用来检测用户参数的有效性。比如说我要写一个用户注册的功能,控制器的作用就是检查你有没有输入用户名,密码,密码是否有效。
(是前端的请求合理性负责)
获取Bean对象时,可以发现我们并不能给注解添加Id,这是因为Spring有命名规则:
⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean。 如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
2.1.2 @Service : 服务存储
Service归属于服务层,调用持久化类实现响应的功能。接着上面的例子,程序拿到你输入的账号和密码后,并不直接调用数据库,而是调用一些持久层方法:添加用户表中的账号和密码。
(不能直接和数据库叫交互,类似于控制中心,是对前端请求功能负责)
2.1.3 @Repository : 仓库存储
Repository归属于持久层,是直接和数据库进行交互的,通常每一个表都会对应一个@Repository,对应上面的例子就是负责写添加用户表中的账号和密码的方法的。
(对数据库的某一个表负责,一个仓库会对应一张表的增删查改操作)
2.1.4 @Component : 组件存储
Component归属于公共工具类,提供一些公共方法
(是其他4个类的父类)
2.1.5 @Configuration : 配置存储
Configuration归属于配置层,是用来配置当前项目信息
(是项目的全局配置)
2.2 方式二:方法注解
@Bean方法注解: 将当前修饰方法的方法对象存储到Spring中
注意:@Bean注解一定要配合五大类注解一块使用,否则是无效的方法注解。
@Bean默认情况下,Bean name = 方法名
@Bean是可以添加name的,这和五大类注解的情况不一样。因为类几乎不能重名,但方法名重名的概率还是很大的。
当然,给@Bean设置了name属性后,使用原来的方法名就不能获取对象了。
二、获取Bean对象
获取 Bean 对象也叫做对象装配,是把对象取出来放到某个类中,也叫作对象注入
1、属性注入
使用@Autowired实现属性注入
优点:实现简单
缺点:
1、不能注入final对象
2、只适用于IoC容器
3、更容易违背单一设计原则 (针对对象是类)
2、Setter注入
优点:符合单一设计原则。因为一个set就针对一个对象
缺点:
1、不能注入final对象
2、注入对象可被修改
(set方法是普通set方法,可以被重复调用,在被调用时就存在修改的风险。这与属性注入不一样,属性注入的修改可以看成是覆盖,set注入与之相比更加危险)
3、构造方法注入
ps:当一个类中只有一个构造方法,可以省略@Autowired
优点:
1、可以注入一个不可变的对象
2、注入的对象不会被修改
1)加入了final修饰符
2)构造方法是随着类加载只执行一次(不能像set有可能执行多次被修改的分享)
3、注入的对象会被完全初始化
4、通用性更好
缺点:
没有属性注入实现简单
除了@Autowired外,Java还提供了@Resource进行注入
那么他俩有什么区别呢?
1)功能支持不同:Autowired可用于Setter注入 ,构造函数注入和属性注入。而Resource只能用于Setter注入和属性注入,不能用于构造方法注入。
2)出生不同:Autowired来自Spring,而Resource来自于JDK
3)参数支持不同:Resource支持更多的参数设置,而Autowired只支持required参数。
将一个类型的对象注入多次的问题的解决办法
两种解决办法:
1、使用@Resource(name = " ")定义
2、使用@Qualifier注解定义名称