1. 程式人生 > >Spring配置優化_構造器注入+自動裝配

Spring配置優化_構造器注入+自動裝配

2014-05-16 09:01:08上課內容:
依賴注入的第二種注入方式:構造器注入 

建立帶引數的構造方法,引數型別為注入類的型別

專案要先新增Spring支援;

package com;

public class Computer {
	private Host host;
	private Display display;

	//public Computer(){}
	public Computer(Host host, Display display) {
		this.host = host;
		this.display = display;
	}

	public void run() {
		System.out.println(host.run() + "; " + display.run());
	}
	/*public void setHost(Host host) {
		this.host = host;
	}
	public void setDisplay(Display display) {
		this.display = display;
	}*/

}

package com;

public class Display {
	public String run(){
		return "我是顯示器,我在執行";
	}
}

package com;

public class Host {
	public String run() {
		return "我是主機,我在執行";
	}

}

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="host" class="com.Host"></bean>
	<bean id="display" class="com.Display"></bean>
	
	<bean id="computer" class="com.Computer"> 
		<!--要有預設構造方法,和屬性的set方法-->
		<!-- <property name="host" ref="host"></property>
		<property name="display" ref="display"></property> -->
		
		<constructor-arg name="host" ref="host"/>
		<!-- 用另外一種,兩種配置 -->
		<constructor-arg index="1">
			<ref bean="display"/>
		</constructor-arg>
		
	</bean>
</beans>

TestComputer
package com;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestComputer {
	@Test
	public void testRun(){
		ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
		Computer computer = (Computer) ac.getBean("computer");
		computer.run();
	}
}
自動裝配:Spring可以自動根據屬性型別、名稱等進行注入
autowire屬性可以設定為no、byType或byName
 
byName 一個都沒找到,不報錯;採用byName方式,將根據屬性名稱在Spring Bean Factory中找,找到即自動注入,否則,什麼都不做
byType 找到一個以上報錯;
Spring提供了依賴檢查功能
default-dependency-check屬性 spring3.0以後沒有了;
package com;

public class Computer {
	private Host host;
	private Display display;

	public Computer(){}
	public Computer(Host host, Display display) {
		this.host = host;
		this.display = display;
	}

	public void run() {
		System.out.println(host.run() + "; " + display.run());
	}
	public void setHost(Host host) {
		this.host = host;
	}
	public void setDisplay(Display display) {
		this.display = display;
	}

}

package com;

public class Display {
	public String run(){
		return "我是顯示器,我在執行";
	}
}

package com;

public class Host {
	public String run() {
		return "我是主機,我在執行";
	}

}

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
	default-autowire="byName"
	>
	<!-- 第一種 :上面的 default-autowire="byName" 全域性的,在beans上配置 -->
	
	<!-- 第二種:autowire="byName" 方式 -->
	<bean id="host" class="com.Host"></bean><!--autowire="byName"名字必須是host -->
	<bean id="display" class="com.Display"></bean>
	
	<bean id="computer" class="com.Computer" autowire="byName"> 
	
	<!-- 第二種:autowire="byType" 方式
	<bean id="host1" class="com.Host"></bean>
	<bean id="display1" class="com.Display"></bean>
	
	<bean id="computer" class="com.Computer" autowire="byType">  
	-->
	
	<!--使用自動裝配 這個不用
	 <property name="host" ref="host"></property> -->
		
	</bean>
</beans>

package com;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestComputer {
	@Test
	public void testRun(){
		ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
		Computer computer = (Computer) ac.getBean("computer");
		computer.run();
	}
}

拆分配置檔案:
新建Dao Service Action的配置檔案,修改web.xml使用萬用字元*;
測試類測試 EmployeeServiceTest  

拆分配置檔案兩種方法
1.配製Spring整合時:配製ContextLoadListener的contextConfigLocation屬性,配置多個配置檔案用,逗號隔開;或者使用萬用字元
2.在公用配置檔案使用<import resource="x.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:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
	  ">


	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>
	
	<!-- 配置事務管理器 -->
	<bean id="txManage" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<!-- 要被事務管理(支援)的方法 -->
	<tx:advice id="txAdvice" transaction-manager="txManage">
		<tx:attributes >
			<!-- 預設false;propagation="REQUIRED":hibernate4的時候必須要使用 REQUIRED-->
			<tx:method name="get*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="search*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="find*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="query*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="*" rollback-for="DataAccessException" propagation="REQUIRED"/> <!-- 讀寫 -->
		</tx:attributes>
	</tx:advice>
	<!-- 切到類裡面去(事務要加到哪裡,一般在業務裡面) -->
	<aop:config>
		<!--execution:切面要在哪裡切,(* com.jboa.*.*(..)):com.jboa.service下所以的類,所以的方法,所以的返回值,都受到切面的影響 -->
		<aop:pointcut expression="execution(* com.jboa.service.*.*(..))" id="serviceMethods"/>
		<!-- 註釋掉,就沒事務了 -->
        <aop:advisor pointcut-ref="serviceMethods" advice-ref="txAdvice"/> 
	</aop:config>
	<!-- 拆分配置檔案:到新建 DaoApplicationContext.xml-->
	<!-- <bean id="accountDao" class="com.jboa.dao.impl.AccountDaoImpl" depends-on="sessionFactory">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<bean id="employeeDao" class="com.jboa.dao.impl.EmployeeDaoImpl" depends-on="sessionFactory">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<bean id="dictionaryDao" class="com.jboa.dao.impl.DictionaryDaoImpl" depends-on="sessionFactory">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean> -->
	<!-- 拆分配置檔案:到新建 ServiceApplicationContext.xml-->
	<!-- <bean id="employeeService" class="com.jboa.service.impl.EmployeeServiceImpl">
		<property name="employeeDao" ref="employeeDao"></property>
	</bean>
	<bean id="dictionaryService" class="com.jboa.service.impl.DictionaryServiceImpl">
		<property name="dictionaryDao" ref="dictionaryDao"></property>
	</bean> -->
	<!-- 拆分配置檔案:到新建 ActionApplicationContext.xml-->
	<!-- <bean id="employeeAction" class="com.jboa.action.EmployeeAction" scope="prototype">
		<property name="employeeService" ref="employeeService"></property>
		<property name="dictionaryService" ref="dictionaryService"></property>
	</bean> -->
	<!-- 第二種方式 -->
	<!-- <import resource="DaoApplicationContext.xml"/>
	<import resource="ServiceApplicationContext.xml"/>
	<import resource="ActionApplicationContext.xml"/> -->
</beans>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	<display-name></display-name>
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
	<!-- 整合Spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<!-- 第一種拆分方式 -->
		<param-value>classpath:*ApplicationContext.xml</param-value>
		<!-- 第二種拆分方式 -->
		<!-- <param-value>classpath:DefaultApplicationContext.xml</param-value> -->
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- 配置strut2的過濾器 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
然後執行測試類測試:
package com.jboa.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jboa.model.Department;
import com.jboa.model.Employee;
import com.jboa.model.Postion;

public class EmployeeServiceTest {
	@Test
	public void testAdd() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("/*ApplicationContext.xml");
		EmployeeService employeeService = (EmployeeService) ac.getBean("employeeService");
		Employee employee = new Employee();
		employee.setSn("user111111");
		employee.setPassword("user111111");
		employee.setStatus("1");
		employee.setName("user111111");
		Postion p = new Postion();
		p.setId(2);
		employee.setPostion(p);
		Department d = new Department();
		d.setId(1);
		employee.setDepartment(d);
		employeeService.add(employee);
	}
}


相關推薦

no