Spring 的 IOC 常用注解主要有用于创建对象的、用于注入数据的、用于改变作用范围的以及和生命周期相关的四部分,本文针对此块内容,进行深入分析与解读。
文章目录
Spring 中的 IOC 常用注解
之前 xml 的配置:
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
scope="" init-method="" destroy-method="">
<property name="" value="" | ref="" ></property>
</bean>
对比之前的 xml 配置,注解开发中都有注解与之相对应。
导入依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
使用注解配置需要在 bean.xml 中进行配置,以说明 bean 的注入采用注解形式,具体配置如下:
<!--告知 spring 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束,
而是一个名称为 context 名称空间和约束中-->
<context:component-scan base-package="com.itheima"></context:component-scan>
一、用于创建对象的
他们的作用就和 XM L配置文件中编写一个 <bean>
标签实现的功能是一样的。
1.1 Component
-
作用:用于把当前类对象存入spring容器中
-
属性:value 用于指定 bean 的 id。当我们不写时,他默认值是当前类名,且首字母改小写。 属性 value 当只有一个值时,value 书写可以省略。
如: 在IOC容器反射创建AccountServiceImpl
的对象的时候。如果不传入参数,则表现层:
IAccountService as = (IAccountService) ac.getBean("accountServiceImpl");
也可以通过在类上面配置
@Component("accountService")
,则表现层传入的参数应保持一样:
IAccountService as = (IAccountService) ac.getBean("accountService");
1.2 Controller(一般用在表现层)
1.3 Service(一般用在业务层)
1.4 Repository(一般用于持久层)
以上三个注解他们的作用和属性与 Component 是一模一样的,因此可以混用。但是为清晰,还是按照标准来。
工程目录:
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 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束中,而是一个名称为 context 名称空间和约束中-->
<context:component-scan base-package="com.axy" />
</beans>
业务层实现类:
@Service("accountService")
public class AccountServiceImpl implements IAccountService {
public AccountServiceImpl() {
System.out.println("无参构造");
}
public void saveAccount(){
System.out.println("保存了账户");
}
}
模拟表现层 Client:
public class Client {
public static void main(String[] args) {
//1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取Bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
as.saveAccount();
ac.close();
}
}
测试结果:
二、用于注入数据的
他们的作用就和 XML 配置文件中的 bean 标签中写一个 <property>
标签的的作用是一样的
2.1 Autowired(★)
-
作用:
-
自动按照类型注入: 只要容器中有唯一的一个 bean 对象类型和要注入的数据类型匹配,就可以注入成功(实现类也可以匹配,如下图)。
-
如果 ioc 容器中没有任何 bean 的类型和要注入的变量类型匹配,则报错。
-
如果 ioc 容器中有多个 bean 的类型和要注入的变量类型匹配,先根据 数据类型 (如:IAccountDao)找到范围,并在范围中在根据 变量的名称(如:accountDao)与 IOC 容器的 key 相匹配,最终注入。
-
-
出现的位置: 可以是变量上,也可以是方法上
细节:在使用 Autowired 注解注入时,set 方法就不是必须的了。@Service("accountService") public class AccountServiceImpl implements IAccountService { private AccountDao accountDao; // Setter注入 @Autowired public void setAccountDao(AccountDao accountDao) { this.accountDao= accountDao; } } 等同于... @Service("accountService") public class AccountServiceImpl implements IAccountService { @Autowired private AccountDao accountDao; }
2.2 Qualifier
-
作用:再按照类中注入的基础之上在按照 value 注入。
他在给类成员注入时不能单独(使用需和 Autowired 配合),但是在给方法参数注入时可以。 -
属性:value 用于指定 bean 的 id,无须考虑 Autowired,但是还需要写上 Autowired。如:
@Autowired @Qualifier("accountDao1") private IAccountDao accountDao = null;
2.3 Resource
-
作用:直接按照 bean 的 id 注入。它可以独立使用。
-
属性:name 用于指定 bean 的 id。如:
@Resource(name = "accountDao1") private IAccountDao accountDao = null ;
以上三个注入只能诸如其他的 bean 类型的数据,而基本类型和 String 类型无法使用上述注解实现。
另外,集合类型的注入只能通过 XML 来实现。
2.4 Value
- 作用:用于注入基本类型和 String 类型的数据
- 属性:value 用于指定数据的值。
它可以使用 spring 中的 SpEl(也就是 spring 的 el 表达式),SpEl的写法也是${表达式}
三、用于改变作用范围的
他们的作用就和在 bean 标签中使用 scope 的属性实现的功能是一样的
- Scope:
- 作用:用于指定bean的作用范围
- 属性:value 指定范围的取值。常用取值:singleton, prototype
@Scope(“prototype”)
在类上使用,如:@Component("accountService") @Scope("prototype") public class AccountServiceImpl implements IAccountService {...}
四、和生命周期相关的(了解)
他们的作用就和在 bean 标签中使用 init-method 和 destroy-method 的作用是一样的
- PostConstruct
1. 作用:用于指定初始化方法 - PreDestroy
1. 作用:用于指定销毁方法@PostConstruct public void init(){ System.out.println("初始化"); } @PreDestroy public void destroy(){ System.out.println("销毁方法Service");//这里单例对象需要手动关闭才会执行该方法 }
本文针对 Spring 对 IOC 常用注解进行分析与讲解,如果大家对文章内容还存在一些疑问,欢迎大家在评论区留言哦~