Spring DI(注解的方式)

203 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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负责数据库的访问。