zoukankan      html  css  js  c++  java
  • Spring定义bean的三种方式和自动注入

    一、定义bean的三种途径:        

    • 首先编写Student和Teacher两个类
    • public class Student {  
        
          private String name;  
        
          private Teacher teacher;  
        
          public String getName() {  
              return name;  
          }  
        
          public void setName(String name) {  
              this.name = name;  
          }  
        
          public Teacher getTeacher() {  
              return teacher;  
          }  
        
          public void setTeacher(Teacher teacher) {  
              this.teacher = teacher;  
          }  
        
      }  
      public class Teacher {  
        
          private String name;  
        
          public String getName() {  
              return name;  
          }  
        
          public void setName(String name) {  
              this.name = name;  
          }  
        
      }  
      • 方法一:基于XML的bean定义(需要提供setter方法)
      • <?xml version="1.0" encoding="UTF-8"?>  
        <beans xmlns="http://www.springframework.org/schema/beans"  
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
          
            <bean id="student" class="test.Student">  
                <property name="name" value="张三"/>  
                <property name="teacher" ref="teacher"/>  
            </bean>  
          
            <bean id="teacher" class="test.Teacher">  
                <property name="name" value="李四"/>  
            </bean>  
          
        </beans>  
        [java] view plain copy
        public class Main {  
          
            public static void main(String args[]){  
                FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml的绝对路径");  
                Student student= (Student) context.getBean("student");  
                Teacher teacher= (Teacher) context.getBean("teacher");  
                System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName());  
                System.out.println("老师的姓名:"+teacher.getName());  
            }  
          
        }  
        • 方法二:基于注解的bean定义(不需要提供setter方法)
        Spring为此提供了四个注解,这些注解的作用与上面的XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),也可以自己修改:
        @Component:当对组件的层次难以定位的时候使用这个注解
        @Controller:表示控制层的组件
        @Service:表示业务逻辑层的组件
        @Repository:表示数据访问层的组件
        使用这些注解的时候还有一个地方需要注意,就是需要在applicationContext.xml中声明<contex:component-scan...>一项,指明Spring容器扫描组件的包目录。
      • @Component("teacher")  
        public class Teacher {  
          
            @Value("李四")  
            private String name;  
          
            public String getName() {  
                return name;  
            }  
          
        }  
        [java] view plain copy
        @Component("student")  
        public class Student {  
          
            @Value("张三")  
            private String name;  
          
            @Resource  
            private Teacher teacher;  
          
            public String getName() {  
                return name;  
            }  
          
            public Teacher getTeacher() {  
                return teacher;  
            }  
          
        }  
        [html] view plain copy
        <?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">  
          
            <!--扫描组件的包目录-->  
            <context:component-scan base-package="test"/>  
          
        </beans>  
        [java] view plain copy
        public class Main {  
          
            public static void main(String args[]){  
                FileSystemXmlApplicationContext context=new FileSystemXmlApplicationContext("applicationContext.xml的绝对路径");  
                Student student= (Student) context.getBean("student");  
                Teacher teacher= (Teacher) context.getBean("teacher");  
                System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName());  
                System.out.println("老师的姓名:"+teacher.getName());  
            }  
          
        }  
        • 方法三:基于Java类的bean定义(需要提供setter方法)
        • @Configuration  
          public class BeansConfiguration {  
            
              @Bean  
              public Student student(){  
                  Student student=new Student();  
                  student.setName("张三");  
                  student.setTeacher(teacher());  
                  return student;  
              }  
            
              @Bean  
              public Teacher teacher(){  
                  Teacher teacher=new Teacher();  
                  teacher.setName("李四");  
                  return teacher;  
              }  
            
          }  
          [java] view plain copy
          public class Main {  
            
              public static void main(String args[]){  
                  AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(BeansConfiguration.class);  
                  Student student= (Student) context.getBean("student");  
                  Teacher teacher= (Teacher) context.getBean("teacher");  
                  System.out.println("学生的姓名:"+student.getName()+"。老师是"+student.getTeacher().getName());  
                  System.out.println("老师的姓名:"+teacher.getName());  
              }  
            
          }  

          二、Spring的自动注入

          • Spring提供了五种自动装配的类型
          no:顾名思义, 显式指明不使用Spring的自动装配功能
          byName:根据属性和组件的名称匹配关系来实现bean的自动装配
          byType:根据属性和组件的类型匹配关系来实现bean的自动装配,有多个适合类型的对象时装配失败
          constructor:与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数
          autodetect:利用Spring的自省机制判断使用byType或是constructor装配
          • 基于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"  
                 xsi:schemaLocation="http://www.springframework.org/schema/beans  
                 http://www.springframework.org/schema/beans/spring-beans.xsd">  
            
              <bean id="student" class="test.Student" autowire="byName">  
                  <property name="name" value="张三"/>  
              </bean>  
            
              <bean id="teacher" class="test.Teacher">  
                  <property name="name" value="李四"/>  
              </bean>  
            
          </beans>  
          这里我并没有显式为Student对象注入Teacher属性,而是使用autowired="byName"代替,这样一来Spring会帮我们处理这些细节,将名字是teacher的组件注入到Student对象中。
           
          • 基于注解的自动装配
          其实上面已经应用过了,这里再提一下@Resource和@Autowired的区别。@Resource默认是使用byName进行装配,@Autowired默认使用byType进行装配。

           
          @Component("teacher")  
          public class Teacher {  
            
              @Value("李四")  
              private String name;  
            
              public String getName() {  
                  return name;  
              }  
            
              public void setName(String name) {  
                  this.name = name;  
              }  
          }  
          
           
          @Component("student")  
          public class Student {  
            
              @Value("张三")  
              private String name;  
            
              @Resource  
              private Teacher teacher;  
            
              public String getName() {  
                  return name;  
              }  
            
              public void setName(String name) {  
                  this.name = name;  
              }  
            
              public Teacher getTeacher() {  
                  return teacher;  
              }  
            
              public void setTeacher(Teacher teacher) {  
                  this.teacher = teacher;  
              }  
          }  


          三、如何进行选择?

            • <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">          

              <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/study"/> <property name="username" value="账号"/> <property name="password" value="密码"/> </bean>
              自动装配:一般我使用基于注解的自动装配。同样也是为了减少XML配置文件的“篇幅”。
  • 相关阅读:
    Codeforces 691A Fashion in Berland
    HDU 5741 Helter Skelter
    HDU 5735 Born Slippy
    HDU 5739 Fantasia
    HDU 5738 Eureka
    HDU 5734 Acperience
    HDU 5742 It's All In The Mind
    POJ Euro Efficiency 1252
    AtCoder Beginner Contest 067 C
    AtCoder Beginner Contest 067 D
  • 原文地址:https://www.cnblogs.com/yimian/p/8286558.html
Copyright © 2011-2022 走看看