美文网首页征服Spring
Spring 的 Bean 管理(注解方式)

Spring 的 Bean 管理(注解方式)

作者: 希希里之海 | 来源:发表于2019-06-18 16:06 被阅读7次

    Spring 的 Bean 管理(注解方式)

    1. 导入必要的 jar 包和 xml 文件

    • 使用注解需要导入 spring-aop 的 jar 包。

    • applicationContext.xml 文件使用下行注解:

    xmlns:context="http://www.springframework.org/schema/context"
    

    2. 使用注解定义 Bean

    Spring2. 5 引入使用注解去定义 Bean。

    • @Component 描述 Spring 框架中 Bean

    除了 @Component 外,Spring 提供了 3 个功能基本和 @Component 等效的注解

    • @Repository 用于对 DAO 实现类进行标注
    • @Service 用于对 Service 实现类进行标注
    • @Contoller 用于对 Controller 实现类进行标注

    这三个注解是为了让标注类本身的用途清晰,Spring 在后继版本会对其增强。

    举个例子:

    @Repository("userDao")
    public class UserDao {
    
        public void save() {
            System.out.println("Dao 中保存用户。。。");
        }
    
    }
    

    具体代码:SpringDemo1.demo1()


    3. Spring 的属性注入 -- 注解方式

    A. 使用@Autowired 进行自动注入
    • @Autowired 默认按照类型进行注入。如果存在两个相同的 Bean 类型相同,则按照名称注入
    • @Autowired 注入时可以针对成员变量或者 set 方法。如果属性提供 setter 方法,注解要加在 setter 方法上;如果属性没有提供 setter 方法,注解直接加在属性上就可以。
    • 通过 @Autowired 的 required 属性,设置一定要找到匹配的 Bean
    B. 使用 @Qualifier 指定注入 Bean 的名称
    • 使用 @Qualifier 指定注入 Bean 的名称
    • 使用 @Qualifier 指定 Bean 名称后,注解 Bean 必须指定相同名称
    // 必须同时使用
    @Autowired
    @Qualifier  //按照名称来注入
    

    举个例子:

    @Component("userService")
    public class UserService {
        // 直接使用注解,不用另外写setter和getter方法
        @Value("米饭")
        private String something;
    
        //自动注入UserDao类
        @Autowired
        //使用名称注入
        @Qualifier("userDao")
        private UserDao userDao;
    
        public void eat() {
            System.out.println("eat:" + something);
        }
    
        public void save() {
            System.out.println("Service 中保存用户。。。");
            userDao.save();
        }
    
    }
    

    具体代码:SpringDemo1.demo2() 和 SpringDemo1.demo3()

    C. @Resource 进行属性注入
    • Spring 提供对 JSR-250中定义 @Resource 标准注解的支持
    • @Resource@Autowired 注解功能相似

    简单来说:

    @Resource = @Autowired + @Qualifier
    

    举个例子:

    @Component("userService")
    public class UserService {
    
        @Resource(name = "userDao")
        private UserDao userDao;
    
        public void save() {
            System.out.println("Service 中保存用户。。。");
            userDao.save();
        }
    
    }
    

    具体代码:SpringDemo1().demo3()

    D. 总结
    • 普通类型:@Value
    • 对象类型:
    @Autowired
    @Qualifier("Beanname")
    或
    @Resource(name = "Beanname")
    

    4. Spring 的其他注解

    Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 spring 可以在创建和拆卸 bean 的时候调用 bean 的两个生命周期方法。

    xml 的配置如下:

    <bean id="foo" class="...Foo" init-method="setup" destory=method="teardown" />
    
    • 当 bean 被载入到容器的时候调用 setup
    • 当 bean 从容器中删除应用的时候调用 teardown(scope=singleton 默认)

    转换为注解方式:

    • @PostConstruct 初始化
    • PreDestory 销毁

    举个例子:

    @Component("bean1")
    public class Bean1 {
    
        @PostConstruct
        public void init() {
            System.out.println("initBean...");
        }
    
        public void say() {
            System.out.println("say...");
        }
    
        @PreDestroy
        public void destroy() {
            System.out.println("destroyBean...");
        }
    }
    

    具体代码:SpringDemo2.demo1()


    5. Bean 的作用范围

    • 使用注解配置的 Bean 和 <bean> 配置的一样,默认作用范围都是 singleton
    • @Scope 注解用于指定 Bean 的作用范围

    举个例子:

    @Component("bean2")
    @Scope("prototype")
    public class Bean2 {
        //....
    }
    

    具体代码:SpringDemo2.demo2()


    6. 传统 XML 配置和注解配置混合使用

    XML 方式的优势

    结构清晰,易于阅读

    注解方式的优势

    开发便捷,属性注入方便

    XML 与注解的整合开发
    1. 引入 context 命名空间
    xmlns:context="http://www.springframework.org/schema/context"
    
    1. 在配置文件中添加 context:annotation-config 标签
    <context:annotation-config />
    

    PS:

    • <context:annotation-config/> 是单独使用属性注解。

    • <context:component-scan base-package="xxx" 是开启注解扫描:可以使用类注解和属性注解。

    具体代码:SpringDemo3.demo1()

    相关文章

      网友评论

        本文标题:Spring 的 Bean 管理(注解方式)

        本文链接:https://www.haomeiwen.com/subject/nsgfqctx.html