zoukankan      html  css  js  c++  java
  • 基于注解的方式管理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 注解,设置创建的对象是单实例还是多实例

       

    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 {

     

    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】

  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/7407147.html
Copyright © 2011-2022 走看看