持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
Spring注解方式实现DI(依赖注入)
- (1)注解实现DI—常规属性 String int double… @Value Hero.java文件
- (2)注解实现DI--@Value注解读取properties文件中的内容
@Value(${xxx}) MySQLConnection.java文件 - (3)注解实现DI—集合和Properties对象 数据写在applicationContext.xml文件中,用util约束 使用@Value(#{@id值})获取数据给属性赋值 Person.java文件
- (4)一个javabean类包含另外一个javabean类的情况 使用注解@Autowired来完成自动装配
自动装配的实现原理
会先按照类型进行匹配,如果找到唯一的类型就进行依赖注入;
如果找不到类型会报错误;
如果找到的为多个类型,则再开始按照id进行查找;如果找到唯一的id就实现依赖注入,如果找不到报错误。
正常情况: 代码运行没有任何异常错误
@Autowired private Dog dog;
先按照类型(Dog类型)找到了3个,Dog类,HSQDog和JMDog,按照类型找是不唯一的; 再按照id查找匹配,根据属性dog匹配id的值,能找到唯一的Dog类
测试1:去掉Dog类上的@Component,运行程序,报错误 先按照Dog类型查找,找到2个,分别是HSQDog和JMDog,按照类型找是不唯一的 再按照id查找,根据属性dog匹配id的值,因为HSQDog和JMDog的默认id都不是dog,所以id没有匹配到,所以程序运行报错误了
测试2:去掉Dog类上的@Component,再去掉HSQDog类上的@Component,运行正常。 先按照Dog类型查找,只查找到了一个,JMDog,按照类型能够找到唯一的。
测试3:HSQDog,JMDog这两个类加@Component,Dog类还是去掉@Component,同时给HSQDog手动的添加id的值为dog。 先按照Dog类型查找,找到了2个,HSDQdog和JMDog,按照类型找到的是不唯一的; 然后再按照id查找,因为HSQDog的id设置的就是dog,根据属性dog就能找到id的dog。 运行正常 使用@Qualifier注解配置@Autowired注解一起使用 自动装配时不再按照类型匹配查找了,直接按照@Qualifier定义的内容直接进行id匹配查找
其它注解(单例,多例,懒加载,spring容器的初始化和销毁)
@Scope 设置单例、多例的注解
@Scope(value=”prototype”) 多例
@Scope(“singleton”) 单例
@Lazy 懒加载注解
@PostConstruct Spring容器初始化的时候执行注解的方法
@PreDestory Spring容器销毁的时候执行注解的方法
案例—软件开发分层、彻底解耦合
@Controller @Service @Repository @Component
这四个注解的功能是完全相同的,都是用来修饰类的,会将类修饰为Spring容器管理的javabean对象。 其中@Component一般认为是通用注解
@Controller一般用在软件分层中的控制层,一般用在web层
@Service一般用在软件分层中的业务访问层,一般用在service层
@Repository一般用在软件分层中的数据访问层,一般用在dao层
Model模型层 View视图层 Controller控制层
JaveEE的经典三层架构
在JavaEE的经典三层架构中,将Model模型层的功能进一步细分,JavaBean只负责数据的封装,Service负责业务逻辑处理,Dao负责数据库的访问。