zoukankan      html  css  js  c++  java
  • Spring框架学习之第8节

    <bean id=”foo” class=”…Foo”>

             <property name=”属性”>

             <!—第一方法引用-->

             <ref bean=”bean对象名”>

             <!—内部bean—>

             <bean>

             <property></property>

             </bean>

             </property>

    </bean>

    ④集成配置

    public class Student

    public class Graduate extends Student

    在beans.xml文件中配置

    思考:目前我们都是通过set的方式给bean注入值的,spring还提供了其他的方式注入值,通过构造函数注入值

    •  通过构造函数注入值

    beans.xml文件关键代码

    <!-- 配置一个雇员对象 -->

    <bean id="employee" class="com.litao.constructor.Employee">

    <!-- 通过构造函数来注入属性值 index代表第几个参数,type是类型 -->

    <constructor-arg index="0" type="java.lang.String" value="大明"/>

    <constructor-arg index="1" type="int" value="23"/>

    </bean>

    set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean。

    •  自动装配bean的属性值 

     

    (1)   byName的用法

    <!-- 配置一个master对象 -->

    <bean id="master" class="com.litao.autowire.Master" autowire="byName">

    <property name="name">

    <value>顺平</value>

    </property>

    <!--

    /* 传统的方法 */

    <property name="dog" ref="dog" />

    -->

    </bean>

    <!-- 配置dog对象 -->

    <bean id="dog" class="com.litao.autowire.Dog">

    <property name="name" value="小黄" />

    <property name="age" value="3" />

    </bean>

    原理图:

    (1)       byType

    寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常

    (2)       constructor:autowire="constructor"

    说明:

    查找和bean的构造参数一致的一个或多个bean,若找不到或找到多个,抛异常。按照参数的类型装配。

    (3)       autodetect:autowire="autodetect"

    说明:(3)和(2)之间选一个方式。不确定

           性的处理与(3)和(2)一致。

    (4)       defualt

    这个需要在<beans defualt-autorwire=“指定” />

    当你在<beans>指定了default-autowire后,所有的bean的默认的autowire就是指定的装配方法

    如果没有在<beans defualt-autorwire=“指定” />,没有default-autowire=”指定”,则默认是default-autowire=”no”.

    (5)       no:不自动装配

    使用spring的特殊bean,完成分散配置

    beans.xml

    说明:当通过context:property-placeholder引入多个属性文件的时候使用逗号间隔

    <!-- 引入我们的db.properties文件 -->

    <context:property-placeholder location="classpath:com/litao/dispatch/db.properties,classpath:com/litao/dispatch/db2.properties"/>

    <!-- 配置一个DButil对象 -->

    <bean id="dbutil" class="com.litao.dispatch.DBUtil">

    <property name="name" value="${name}" />

    <property name="drivername" value="${drivername}" />

    <property name="url" value="${url}" />

    <property name="pwd" value="${pwd}" />

    </bean>

    <!-- 配置一个DButil2对象 -->

    <bean id="dbutil2" class="com.litao.dispatch.DBUtil">

    <property name="name" value="${db2.name}" />

    <property name="drivername" value="${db2.drivername}" />

    <property name="url" value="${db2.url}" />

    <property name="pwd" value="${db2.pwd}" />

    </bean>

    db.properties

    name=scott

    drivername=oracle:jdbc:driver:OracleDriver

    url=jdbc:oracle:thin:@127.0.0.1:1521:hsp

    pwd=tiger

    #key=value

    项目结构:

    /******************************com.litao.autowire包***************************************************/

    com.litao.autowire.App1.java

    package com.litao.autowire;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
     
    public class App1 {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ac = new ClassPathXmlApplicationContext("com/litao/autowire/beans.xml");
            //通过容器获取主人
            Master master = (Master) ac.getBean("master");
            System.out.println(master.getName()+" "+master.getDog().getName());
            
        }
     
    }
    

    com.litao.autowire.Dog.java

    package com.litao.autowire;
    
    import javax.annotation.Resource;
    
    
    public class Dog {
    	
    	private String name;
    	private int age;
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    }
    

    com.litao.autowire.Master.java

    package com.litao.autowire;
    
    public class Master {
    	
    	private String name;
    	private Dog dog;
    	
    	public Master(Dog dog){
    		System.out.println("Master(Dog dog)构造函数被调用");
    		this.dog = dog;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Dog getDog() {
    		return dog;
    	}
    	public void setDog(Dog dog) {
    		this.dog = dog;
    	}
    
    }
    

    com.litao.autowire.beans.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"
    		xmlns:tx="http://www.springframework.org/schema/tx"
    		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
    				 default-autowire="no"
    				>        
    
    
    <!-- 配置一个master对象 -->
    <bean id="master" class="com.litao.autowire.Master">
    <property name="name">
    <value>顺平</value>
    </property>
    <!-- 
    /* 传统的方法 */
    <property name="dog" ref="dog" />
    -->
    </bean>
    <!-- 配置dog对象 -->
    <bean id="dog11" class="com.litao.autowire.Dog">
    <property name="name" value="小黄" />
    <property name="age" value="3" />
    </bean>
    
    </beans>
    

    /******************************com.litao.collection包***************************************************/

    App1.java

    package com.litao.collection;
     
    import java.util.Enumeration;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Map.Entry;
     
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    public class App1 {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ApplicationContext ac = new ClassPathXmlApplicationContext("com/litao/collection/beans.xml");
     
            Department department = (Department)ac.getBean("department");
            System.out.println(department.getName());
            for (String emName : department.getEmpName()) {
                System.out.println(emName);
            }
             
            System.out.println("************通过list集合取出数据**************");
            for(Employee e: department.getEmpList()){
                 
                System.out.println("name=" + e.getName() + " " + e.getId());
                 
            }
             
            //set取得时候不能保证顺序,list取时可以保证顺序
            System.out.println("************通过set集合取出数据**************");
            for(Employee e: department.getEmpsets()){
                 
                System.out.println("name=" + e.getName());
                 
            }
            System.out.println("************通过map集合取出数据**************");
            //1.用迭代器
            Map<String,Employee> empmaps = department.getEmpMaps();
             
            Iterator it = empmaps.keySet().iterator();
             
            while (it.hasNext()) {
                String key = (String)it.next();
                //System.out.println(key);
                Employee emp = empmaps.get(key);
                System.out.println("key="+key+" "+emp.getName());
            }
             
            //2.最简洁的方法
            for(Entry<String,Employee> entry1:department.getEmpMaps().entrySet()){
                System.out.println(entry1.getKey() + " " + entry1.getValue().getName());
                 
            }
            
            System.out.println("**************通过Properties取出数据**************");
             Properties pp = department.getPp();
             //System.out.println(pp.getProperty("pp1").toString());
             for(Entry<Object,Object> entry:pp.entrySet()){
            	 System.out.println(entry.getKey().toString()+" "+ entry.getValue().toString());	 
             }
             System.out.println("**************通过Enumeration取出数据**************");
    
             Enumeration en = pp.keys();
             while (en.hasMoreElements()) {
            	 //Entry<Object,Object> element = (Entry<Object,Object>) en.nextElement();
    			//System.out.println(element.getKey()+ " " +element.getValue());
    			
            	 String key = (String)en.nextElement();
            	 
    			System.out.println(key+ " " + pp.getProperty(key));
    		}
             
        }
     
    }
    

    Department.java

    package com.litao.collection;
     
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;
     
    public class Department {
     
        private String name;
        private String[] empName;
        private List<Employee> empList;
        private Set<Employee> empsets;
        private Map<String,Employee> empMaps;
        private Properties pp;//Properties的配置使用
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String[] getEmpName() {
            return empName;
        }
        public void setEmpName(String[] empName) {
            this.empName = empName;
        }
         
        public List<Employee> getEmpList() {
            return empList;
        }
        public void setEmpList(List<Employee> empList) {
            this.empList = empList;
        }
        public Set<Employee> getEmpsets() {
            return empsets;
        }
        public void setEmpsets(Set<Employee> empsets) {
            this.empsets = empsets;
        }
        public Map<String, Employee> getEmpMaps() {
            return empMaps;
        }
        public void setEmpMaps(Map<String, Employee> empMaps) {
            this.empMaps = empMaps;
        }
    	public Properties getPp() {
    		return pp;
    	}
    	public void setPp(Properties pp) {
    		this.pp = pp;
    	}
         
         
    }
    

    Employee.java

    package com.litao.collection;
     
    public class Employee {
         
        private String name;
        private int id;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
    }
    

    beans.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:aop="http://www.springframework.org/schema/aop"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
     
    <bean id="department" class="com.litao.collection.Department">
    <property name="name" value="财务部" />
    <!-- 给数组注入值 -->
    <property name="empName">
    <list>
        <value>小明</value>
        <value>小明小明</value>
        <value>小明小明小明小明</value>
    </list>
    </property>
    <!-- 给list注入值 list中可以有相同的对象 -->
    <property name="empList">
        <list>
            <ref bean="emp1"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
        </list>
    </property>
    <!-- 给set注入值 set中不能有相同的对象 -->
    <property name="empsets">
        <set>
            <ref bean="emp1"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
            <ref bean="emp2"/>
        </set>
    </property>
    <!-- 给map注入值 map中也不能有相同的对象,后面的会把前面的覆盖,map只要key一样就可以装配value对应的bean -->
    <property name="empMaps">
        <map>
            <entry key="1" value-ref="emp1"></entry>
            <entry key="2" value-ref="emp2"></entry>
            <entry key="2" value-ref="emp2"></entry>
        </map>
    </property>
    <!-- 给属性集合配置 -->
    <property name="pp">
    	<props>
    		<prop key="pp1">abcd</prop>
    		<prop key="pp2">hello</prop>		
    	</props>
    </property>
    </bean>
    <bean id="emp1" class="com.litao.collection.Employee">
    <property name="name" value="北京" />
    <property name="id" value="1" />
    </bean>
    <bean id="emp2" class="com.litao.collection.Employee">
    <property name="name" value="天津" />
    <property name="id" value="2" />
    </bean>
    </beans>
    

    /******************************com.litao.constructor包************************************************/

    App1.java

    package com.litao.constructor;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class App1 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
            ApplicationContext ac = new ClassPathXmlApplicationContext("com/litao/constructor/beans.xml");
    
            Employee ee = (Employee)ac.getBean("employee");
            System.out.println(ee.getName());
    	}
    
    }
    

    Employee.java

    package com.litao.constructor;
    
    public class Employee {
    	
    	private String name;
    	private int age;
    	
    	
    	public Employee() {
    	}
    	
    	public Employee(String name, int age) {
    		System.out.println("Employee(String name, int age)构造函数被调用");
    		this.name = name;
    		this.age = age;
    	}
    	
    	public Employee(String name) {
    		System.out.println("Employee(String name)构造函数被调用");
    		this.name = name;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	
    
    }
    

    beans.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"
    		xmlns:tx="http://www.springframework.org/schema/tx"
    		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
     
    <!-- 配置一个雇员对象 -->
    <bean id="employee" class="com.litao.constructor.Employee">
    <!-- 通过构造函数来注入属性值 index代表第几个参数,type是类型 -->
    <constructor-arg index="0" type="java.lang.String" value="大明"/>
    <constructor-arg index="1" type="int" value="23"/>
    </bean>
    </beans>
    

      

    /******************************com.litao.dispatch包************************************************/

    App1.java

    package com.litao.dispatch;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class App1 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
            ApplicationContext ac = new ClassPathXmlApplicationContext("com/litao/dispatch/beans.xml");
    
            DBUtil dbUtil = (DBUtil)ac.getBean("dbutil2");
            System.out.println(dbUtil.getDrivername()+" "+ dbUtil.getPwd());
    	
    	}
    
    }
    

    DBUtil.java

    package com.litao.dispatch;
    
    public class DBUtil {
    	
    	private String drivername;
    	private String url;
    	private String name;
    	private String pwd;
    	
    	public String getDrivername() {
    		return drivername;
    	}
    	public void setDrivername(String drivername) {
    		this.drivername = drivername;
    	}
    	public String getUrl() {
    		return url;
    	}
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    
    }
    

    beans.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"
    		xmlns:tx="http://www.springframework.org/schema/tx"
    		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">        
    
    <!-- 引入我们的db.properties文件 -->
    <context:property-placeholder location="classpath:com/litao/dispatch/db.properties,classpath:com/litao/dispatch/db2.properties"/>
    <!-- 配置一个DButil对象 -->
    <bean id="dbutil" class="com.litao.dispatch.DBUtil">
    <property name="name" value="${name}" />
    <property name="drivername" value="${drivername}" />
    <property name="url" value="${url}" />
    <property name="pwd" value="${pwd}" />
    </bean>
    
    <!-- 配置一个DButil2对象 -->
    <bean id="dbutil2" class="com.litao.dispatch.DBUtil">
    <property name="name" value="${db2.name}" />
    <property name="drivername" value="${db2.drivername}" />
    <property name="url" value="${db2.url}" />
    <property name="pwd" value="${db2.pwd}" />
    </bean>
    </beans>
    

    db.properties

    name=scott
    drivername=oracle:jdbc:driver:OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:hsp
    pwd=tiger
    #key=value
    

    db.properties2

    db2.name=scott3
    db2.drivername=oracle:jdbc:driver:OracleDriver3
    db2.url=jdbc:oracle:thin:@127.0.0.1:1521:hsp3
    db2.pwd=tiger3
    
    #key=value
    

    /******************************com.litao.inherit包************************************************/

    App1.java

    package com.litao.inherit;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class App1 {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		   ApplicationContext ac = new ClassPathXmlApplicationContext("com/litao/inherit/beans.xml");
    		   
    		   Graduate graduate = (Graduate)ac.getBean("graduate");
    		   System.out.println(graduate.getName() + " " + graduate.getAge() + " " + graduate.getDegree());
    		   
    	}
    
    }
    

    Graduate.java

    package com.litao.inherit;
    
    public class Graduate extends Student {
    	
    	private String degree;
    
    	public String getDegree() {
    		return degree;
    	}
    
    	public void setDegree(String degree) {
    		this.degree = degree;
    	}
    	
    
    }
    

    Student.java

    package com.litao.inherit;
    
    public class Student {
    	
    	protected String name;
    	protected String age;
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getAge() {
    		return age;
    	}
    	public void setAge(String age) {
    		this.age = age;
    	}
    
    }
    

    beans.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:aop="http://www.springframework.org/schema/aop"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
     
    <!-- 配置一个学生对象 -->
    <bean id="student" class="com.litao.inherit.Student">
    	<property name="name" value=" 李涛" />
    	<property name="age" value="30" />
    </bean>
    <!-- 配置一个Graduate对象 -->
    <bean id="graduate" parent="student" class="com.litao.inherit.Graduate">
    	<!-- 如果自己配置属性name,age,则会替换从父对象集成的数据 -->
    	<property name="name" value="小明" />
    	<property name="degree" value="学士" />
    </bean>
    </beans>
    
  • 相关阅读:
    mysql-community-server-5.7.24 & 5.7.31 (5.6.35 升级到 5.7.24)
    企业 数据 能力 中台 大数据平台 CRM
    Tomcat日志切割配置
    你不知道的 Blob
    细说websocket快速重连机制
    DNS反向查询
    从安全的角度看待DNS
    LVS 负载均衡集群
    Linux服务器配置DNS解析
    react修改state的值
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/5784420.html
Copyright © 2011-2022 走看看