基于注解的方式管理Bean
Posted siwuxie095
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于注解的方式管理Bean相关的知识,希望对你有一定的参考价值。
--------------------siwuxie095
基于注解的方式管理 Bean
(一)准备
1、注解,可以理解为代码中的特殊标记,使用注解可以帮助完成功能
2、注解写法:@注解名称(属性名称="属性值")
3、注解可以使用在类上面、方法上面、属性上面
4、注解可以替代配置文件来管理 Bean,但不可能完全脱离配置
文件,仍然需要在配置文件中做少许配置
5、创建 Spring 配置文件,并引入 XML 约束
spring-beans-4.3.xsd 和 spring-context-4.3.xsd
注意:要引入和 Spring 版本对应的 XML 约束
在 applicationContext.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"> |
6、在配置文件中开启注解扫描
applicationContext.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 注解开发除了要引入约束:
http://www.springframework.org/schema/beans/spring-beans.xsd
还要引入新的约束:
http://www.springframework.org/schema/context/spring-context.xsd -->
<!-- 开启注解扫描:到包中扫描类、方法、属性上面是否有注解
base-package 属性:表示要扫描的包。如果有多个,以逗号隔开, 或 缩短包路径,写成 com.siwuxie095,甚至写成 com --> <context:component-scan base-package="com.siwuxie095.anno"></context:component-scan>
<!-- 只扫描属性上面是否有注解
<context:annotation-config></context:annotation-config> -->
</beans> |
(二)注解创建对象
1、在要创建对象的类上面,使用注解即可实现
2、创建对象的注解一共有四个,且都作用在类上:
(1)@Component
(2)@Controller
(3)@Service
(4)@Repository
「目前这四个注解功能是一样的,都用来创建对象」
3、在类上加上 @Scope 注解,设置创建的对象是单实例还是多实例
(1)singleton:默认值,单实例
(2)prototype:多实例
4、具体实现
(1)编写一个普通类
User.java:
package com.siwuxie095.anno;
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component;
/** * 用注解的方式创建对象:@Component(value="user") * * 也可简写为 @Component("user"),即 value 省略不写 * * * 类似于配置文件中的:<bean id="user" class="com.siwuxie095.anno.User"></bean> * */ @Component(value="user") @Scope(value="singleton") public class User {
public void add() { System.out.println("----- add -----"); }
} |
(2)编写一个测试类
TestAnno.java:
package com.siwuxie095.anno;
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnno {
/** * 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 的 jar 包) * * 选中方法名,右键->Run As->JUint Test */ @Test public void testUser() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User) context.getBean("user");
user.add(); }
} |
(三)注解注入属性
1、应用场景:在 Service 类中得到 Dao 类的对象
2、属性注入的注解:
(1)@Autowired:默认按类型进行装配注入
如果想要按名称进行装配注入,需要结合 @Qualifier 注解进行使用
(2)@Resource:默认按名称进行装配注入
「使用注解注入属性,可以不提供属性的 set 方法」
4、@Autowired 和 @Resource 可作用在属性和属性的 set 方法上
5、建议:
@Autowired 由 Spring 提供,@Resource 由 J2EE 提供
为减少对 Spring 的依赖,建议使用 @Resource
6、具体实现
(1)编写一个 Dao 类
Dao.java:
package com.siwuxie095.anno;
import org.springframework.stereotype.Component;
/** * 用注解的方式创建对象:@Component(value="dao") * * 也可简写为 @Component("dao"),即 value 省略不写 */ @Component(value="dao") public class Dao {
public void add() { System.out.println("----- Dao -----"); }
} |
(2)编写一个 Service 类
Service.java:
package com.siwuxie095.anno;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component;
/** * 用注解的方式创建对象:@Component(value="service") * * 也可简写为 @Component("service"),即 value 省略不写 */ @Component(value="service") public class Service {
/* * 注意:(1)=(2)=(3),三者可相互替换 */
/* (1) * * @Autowired 默认按类型进行装配注入 * * 使用注解注入属性,可以不提供属性的 set 方法 */ @Autowired private Dao dao;
/* (2) * * @Autowired 和 @Qualifier(value="dao") 结合使用, * 即 按名称进行装配注入(可写在同一行,也可写在两行) * * value 可以省略不写,即 @Qualifier("dao") */ // @Autowired // @Qualifier(value="dao") // private Dao dao;
/* (3) * * @Resource 默认按名称进行装配注入 * * @Resource(name="dao") 按名称进行装配注入 * * @Resource(type=Dao.class) 按类型进行装配注入 */ // @Resource // private Dao dao;
public void add() { System.out.println("----- Service -----"); dao.add(); }
} |
(3)编写一个测试类
TestAnno.java:
package com.siwuxie095.anno;
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnno {
/** * 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 的 jar 包) * * 选中方法名,右键->Run As->JUint Test */ @Test public void testService() {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Service service=(Service) context.getBean("service");
service.add(); }
} |
(四)注解和配置文件混合使用
1、一般情况下:
(1)创建对象的操作,使用配置文件的方式实现
(2)注入属性的操作,使用注解的方式实现
2、具体实现
(1)编写一个 Dao 类
Dao.java:
package com.siwuxie095.anno;
public class Dao {
public void add() { System.out.println("----- Dao -----"); }
} |
(2)编写一个 Service 类
Service.jav 以上是关于基于注解的方式管理Bean的主要内容,如果未能解决你的问题,请参考以下文章 spring5:IOC 操作 Bean 管理(基于注解方式)