基于注解的方式管理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

   

目前这四个注解功能是一样的,都用来创建对象」

   

基于注解的方式管理Bean

   

   

   

3、在类上加上 @Scope 注解,设置创建的对象是单实例还是多实例

   

1singleton:默认值,单实例

   

2prototype多实例

   

   

   

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 >

*

*/

@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.java:

   

package com.siwuxie095.anno;

   

import javax.annotation.Resource;

   

   

public class Service {

 

@Resource

private Dao dao;

   

 

public void add() {

System.out.println("----- Service -----");

dao.add();

}

 

}

   

   

   

3)在配置文件中配置 Bean

   

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">

   

   

<!--

开启注解扫描:到包中扫描类、方法、属性上面是否有注解

 

base-package 属性:表示要扫描的包。如果有多个,以逗号隔开,

缩短包路径,写成 com.siwuxie095,甚至写成 com

-->

<context:component-scan base-package="com.siwuxie095.anno"></context:component-scan>

 

<bean id="dao" class="com.siwuxie095.anno.Dao"></bean>

 

<bean id="service" class="com.siwuxie095.anno.Service"></bean>

   

   

</beans>

   

   

   

4)编写一个测试类

   

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();

}

 

}

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】