zoukankan      html  css  js  c++  java
  • Spring框架第四篇之基于注解的DI注入

    一、说明

    与@Component注解功能相同,但意义不同的注解还有三个:

    1)@Repository:注解在Dao实现类上
    2)@Service:注解在Service实现类上
    3)@Controller:注解在SpringMVC的处理器上

    Bean作用域:
    @Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton

    基本类型属性注入:
    @Value

    @Autowired:byType方式的注解式注入,即根据类型注解
    @Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用

    域属性注解:
    @Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
    @Resource(name="mySchool"):byName方式的注解式注入

    Bean的生命始末:
    @PostConstruct:当前Bean初始化刚完毕
    @PreDestroy:当前Bean即将被销毁

    @Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建

    注意:

      在举例之前声明几个问题:

      1、注解需要依赖spring-aop-4.3.9.RELEASE.jar包,所以需要导入依赖包。

      2、使用注解方式注入,配置文件需要添加约束头文件:

    <?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的说明文档中找到此头文件:

      3、如果使用到了SpringJUnit4测试,则还需要导入spring-test-4.3.9.RELEASE.jar包

    二、举例

    1、首先创建一个School类:

    package com.ietree.spring.basic.annotation.demo1;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component("mySchool")
    public class School {
    
        @Value(value = "清华大学")
        private String name;
    
        public School() {
            super();
        }
    
        public School(String name) {
            super();
            this.name = name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "School [name=" + name + "]";
        }
    
    }

    创建Student类:

    package com.ietree.spring.basic.annotation.demo1;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * 说明:
     * 与@Component注解功能相同,但意义不同的注解还有三个:
     * 1)@Repository:注解在Dao实现类上
     * 2)@Service:注解在Service实现类上
     * 3)@Controller:注解在SpringMVC的处理器上
     * 
     * Bean作用域:
     * @Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton
     * 
     * 基本类型属性注入:
     * @Value
     * 
     * @Autowired:byType方式的注解式注入,即根据类型注解
     * @Qualifier("mySchool"):byName方式的注解式注入,在使用@Qualifier时必须与@Autowired联合使用
     * 
     * 域属性注解:
     * @Resource:不加name属性则为byType方式的注解式注入,但前提是注入的对象只能有一个
     * @Resource(name="mySchool"):byName方式的注解式注入
     * 
     * Bean的生命始末:
     * @PostConstruct:当前Bean初始化刚完毕
     * @PreDestroy:当前Bean即将被销毁
     */
    //@Scope("prototype")
    @Component("myStudent")
    public class Student {
    
        @Value(value = "小明")
        private String name;
        
        @Value(value = "25")
        private int age;
        
        //    @Autowired
        //    @Qualifier("mySchool")
        //    @Resource(name="mySchool")
        @Resource
        private School school;// 对象属性,也叫做域属性
    
        public Student() {
            super();
        }
        
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public void setName(String name) {
            System.out.println("执行setName()");
            this.name = name;
        }
    
        public void setAge(int age) {
            System.out.println("执行setAge()");
            this.age = age;
        }
    
        public void setSchool(School school) {
            this.school = school;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + ", school=" + school + "]";
        }
        
        @PostConstruct
        public void initAfter(){
            System.out.println("当前Bean初始化刚完毕");
        }
        
        @PreDestroy
        public void preDestroy(){
            System.out.println("当前Bean即将被销毁");
        }
    }

    创建MyJavaConfig类:

    package com.ietree.spring.basic.annotation.demo1;
    
    import org.springframework.beans.factory.annotation.Autowire;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @Configuration:表示当前类充当Spring容器,即所有的Bean将由这个类来创建
     */
    @Configuration
    public class MyJavaConfig {
        
        @Bean(name="mySchool")
        public School mySchoolCreator(){
            return new School("清华大学");
        }
        
        // autowire=Autowire.BY_TYPE:指从当前类这个容器中查找与域属性的类型具有is-a关系的Bean
        // autowire=Autowire.BY_NAME:指从当前类这个容器中查找与域属性同名的Bean
        @Bean(name="myStudent", autowire=Autowire.BY_TYPE)
        public Student myStudentCreator(){
            return new Student("小明", 25);
        }
    }

    创建配置文件:

    <?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">
        
        <!-- 扫描 com.ietree.spring.basic.annotation.demo1这个包及其子包 -->
        <context:component-scan base-package="com.ietree.spring.basic.annotation.demo1"/>
        
        <!-- 扫描 com.ietree.spring.basic这个包的子包 -->
        <context:component-scan base-package="com.ietree.spring.basic.*"/>
        
    </beans>

    创建测试类:

    package com.ietree.spring.basic.annotation.demo1;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations="classpath:com/ietree/spring/basic/annotation/demo1/applicationContext.xml")
    public class MyTest {
        
        @Autowired
        private Student student;
        
        @Test
        public void test01() {
    
            String resource = "com/ietree/spring/basic/annotation/demo1/applicationContext.xml";
            ApplicationContext ctx = new ClassPathXmlApplicationContext(resource);
    
            School school = (School) ctx.getBean("mySchool");
            System.out.println(school);
    
            Student student = (Student) ctx.getBean("myStudent");
            System.out.println(student);
            
            ((ClassPathXmlApplicationContext)ctx).close();
        }
        
        public void test02(){
            System.out.println(student);
        }
        
    }

     注意:如果配置了XML,同时又配置了注解,那么程序会首先选择XML配置创建对象。

  • 相关阅读:
    常用的Javascript设计模式
    jQuery动画高级用法——详解animation中的.queue()函数
    区分苹果Safari浏览器
    自定义 placeholder 文本颜色
    Three.js资源
    动态添加样式表规则
    GitHub 上一份很受欢迎的前端代码优化指南
    [转载]盒模型display:-webkit-box;的使用
    CSS3 Background-size
    Ubuntu上安装torque过程
  • 原文地址:https://www.cnblogs.com/Dylansuns/p/7096948.html
Copyright © 2011-2022 走看看