Spring的注解IOC
注解如果要生效,需要在配置文件中声明使用注解进行配置。并指定扫描的包
<context:component-scan base-package="com.itheima"></context:component-scan>
注解分类
IOC注解(创建对象)*****
Component
作用:用于把当前类对象存入spring容器中
属性:
value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写
衍生的三个注解,和Component的作用一致
Controller:一般用在表现层
Service:一般用在业务层
Repository:一般用在持久层
依赖注入的注解*****
自动注入
@Autowired
自动把容器中已有的值注入到指定位置。
匹配的原则:
首先按照类型进行匹配,如果容器中有且只有一个与之对应的数据,直接注入。
如果容器中没有任何与之对应的,默认会报错。如果使用required属性指定为false,可以不注入 @Autowired(required = false)
如果容器中有多于一个数据可以类型匹配,
先按照变量名称作为容器中数据的key查找,如果能找到,注入此数据。
如果找不到,直接报错。
注入list或map集合的情况
如果是list集合,会把容器中所有跟list集合的泛型匹配的数据都放入list中
如果是map集合,要求map的key的类型必须是String。此时会把容器中类型能和map的值的泛型匹配的元素都放入map。
注入的其他注解
@Qualifier:
作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(稍后我们讲)
属性:
value:用于指定注入bean的id。
@Resource
等价于Autowired和Qualifier的组合
属性名称为name,不可省略
@Value
作用:用于注入基本类型和String类型的数据
属性:
value:用于指定数据的值。它可以使用spring中SpEL(也就是
SpEL的写法:${表达式}
作用范围和生命周期相关注解(了解)
Scope
作用:用于指定bean的作用范围,默认是单例的
属性:
value:指定范围的取值。常用取值:singleton prototype
PreDestroy
作用:用于指定销毁方法
PostConstruct
作用:用于指定初始化方法
案例:*****
使用半注解半xml的开发方式(开发中经常会使用这种配置方式)
自定义的类的管理可以使用注解完成
如果是第三方jar包中的类,使用xml配置
Spring纯注解开发配置***
@Configuration
用于指定某个类是spring的配置类,在其中可以设置spring的一些参数。相当于是替代了spring的配置文件。
@ComponentScan
用于指定spring要扫描的包,便于解析注解。
@Bean
作用:用于把指定工厂方法的返回值作为bean对象存入spring的ioc容器中
属性:
name:用于指定bean的id。当不写时,默认值是当前方法的名称
细节:
当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
查找的方式和Autowired注解的原理是一样的(可以理解为,只要用Bean注解配置了方法,此方法的参数自带Autowired注解)
可以使用Qualifier注解直接指定需要注入的bean的id完成注入。
@Import
作用:用于导入其他的配置类。写在主配置类中的,一般会使用主配置引入多个单独的配置文件共同组合成最终的配置。
属性:
value:用于指定其他配置类的字节码。
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
Spring整合Junit**
默认Junit不会创建spring容器,更不会自动注入需要的对象。
如果能让Junit支持spring,可以帮我们在执行测试代码之前创建并维护容器,就可以支持spring的设置了。
Junit提供了一个注解RunWith,可以用于替换Junit原有的执行类。
Spring提供了一个Junit的执行类,这个执行类会帮助我们创建IOC容器。
Spring提供了一个ContextConfiguration注解,用于指定创建容器时配置的获取方式。
属性:
classes:用于指定注解配置时的配置类
locations:用于指定xml配置时的配置文件路径