基于注解的方式管理Bean

来源:互联网 发布:淘宝手机详情有用吗 编辑:程序博客网 时间:2024/05/17 19:18

--------------------siwuxie095

  

  

  

  

  

  

  

  

基于注解的方式管理 Bean

  

  

(一)准备

  

  

1注解,可以理解为代码中的特殊标记,使用注解可以帮助完成功能

  

  

  

2、注解写法:@注解名称(属性名称="属性值")

  

  

  

3、注解可以使用在上面、方法上面、属性上面

  

  

  

4、注解可以替代配置文件来管理Bean,但不可能完全脱离配置

文件,仍然需要在配置文件中做少许配置

  

  

  

5、创建Spring 配置文件,并引入 XML 约束

  

spring-beans-4.3.xsdspring-context-4.3.xsd

  

注意:要引入和Spring版本对应的 XML 约束

  

  

applicationContext.xml 中添加如下约束:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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-scanbase-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 注解,设置创建的对象是单实例还是多实例

  

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 id="user" class="com.siwuxie095.anno.User"></bean>

*

*/

@Component(value="user")

@Scope(value="singleton")

public class User {

 

publicvoid 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

publicvoid 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 {

  

publicvoid 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;

 

publicvoid 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

publicvoid 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 {

  

publicvoid add() {

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

}

 

}

  

  

  

2)编写一个Service 类

  

Service.java:

  

package com.siwuxie095.anno;

  

import javax.annotation.Resource;

  

  

public class Service {

 

@Resource

private Dao dao;

  

 

publicvoid add() {

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

dao.add();

}

 

}

  

  

  

3)在配置文件中配置Bean

  

applicationContext.xml:

  

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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-scanbase-package="com.siwuxie095.anno"></context:component-scan>

 

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

 

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

publicvoid testService() {

 

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

Service service=(Service) context.getBean("service");

 

service.add();

}

 

}

  

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

原创粉丝点击