基于注解的IoC配置
开启Spring注解支持
Spring的注解支持需要spring-aop-5.0.2.RELEASE.jar
Jar包。
需要在Spring的配置文件中设置让Spring支持注解。
如bean.xml
<?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:context="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
http://www.springframework.org/schema/context/spring-context.xsd">
<!--告知Spring在创建容器时要扫描的包,配置所需要的标签不是在bean的约束中,
而是一个名称为context名称空间和约束中-->
<context:component-scan base-package="com.coydone"></context:component-scan>
</beans>
曾经的xml配置:
<bean id="userService" class="com.coydone.service.impl.UserServiceImpl" scope="" init-method="" destroy-method="">
<property name="" value="" / ref=""></property>
</bean>
常用注解
用于创建对象
它们的作用就和在XML配置文件中编写一个<bean>
标签实现的功能是一样的。
@Component
作用:把资源让Spring来管理。相当于在xml中配置一个 bean。用于把当前类对象存入Spring容器中。
属性:value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名,且首字母改小写。
@Controller、@Service、@Repository
它们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。他们只不过是提供了更加明确的语义化。
@Controller:一般用于表现层的注解。
@Service:一般用于业务层的注解。
@Repository:一般用于持久层的注解。
细节:如果注解中有且只有一个属性要赋值时,且名称是value,value在赋值是可以不写。
用于注入数据
它们的作用就和在XML配置文件中的bean标签中写一个<property>
标签的作用是一样的。
@Autowired
属性注解、方法注解(set),声明当前属性自动装配,默认byType。
@Autowired(required = false) 通过requried属性设置当前自动装配是否为必须(默认必须,如果没有找到类型与属性类型匹配的bean则抛出异常)
自动按照类型注入(自动装配)。当使用注解注入属性时,set方法可以省略。它只能注入其它bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在Spring容器查找,找到了也可以注入成功。找不到就报错。
@Qualifier
作用:在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowired 一起使用;但是给方法参数注入时,可以独立使用。(byType、ref引用)
属性:value:指定 bean 的 id。
@Autowired
public void setClazz(@Qualifier("c2" ) Clazz clazz) {
this.clazz = clazz;
}
@Resource
直接按照Bean的id注入。它也只能注入其他bean类型。
属性注解,也用于声明属性自动装配。默认装配方式为byName,如果根据byName没有找到对应的bean,则继续根据byType寻找对应的bean,根据byType如果依然没有找到Bean或者找到不止一个类型匹配的bean,则抛出异常。
属性:name:指定bean的id。
以上三个注入都只能注入其它bean类型的数据,而基本类型和String类型无法使用上述注解实现。集合类型的注入只能通过XML来实现。
@Value
作用:注入基本数据类型和String类型数据的。
属性:value:用于指定值。它可以使用Spring中的SpEL(也就是Spring的EL表达式)。写法:${表达式}
。
用于改变作用范围
它们的作用就和在bean标签中使用scope属性实现的功能是一样的。
@Scope
作用:指定 bean 的作用范围。
属性:value:指定范围的值;取值:singleton、prototype、request、session、globalsession。
@Lazy
类注解,用于声明一个单例模式的Bean是否为懒汉模式。@Lazy(true) 表示声明为懒汉模式,默认为饿汉模式。
生命周期相关(了解)
它们的作用就和在bean标签中使用init-method
和destroy-method
的作用是一样的。
@PostConstruct
方法注解,声明一个方法为当前类的初始化方法(在构造器之后执行),相当于bean标签的init-method属性。
@PreDestroy
方法注解,声明一个方法为当前类的销毁方法(在对象从容器中释放之前执行),相当于bean标签的destory-method属性。
关于Spring注解和XML的选择问题
注解的优势:配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。
XML 的优势:修改时,不用改源码。不涉及重新编译和部署。
Spring管理Bean方式的比较:
评论区