spring相关-依赖注入

1.应用setter实现bean的依赖注入

在对象中把bean设置私有属性并设置getter和setter:

public class TestUtil {
	private User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}	
	public boolean getUserInfo(){
		if(user!=null){
			return true;
		}else{
			return false;
		}
		
	}
}

在Spring的xml配置文件中通过<bean>标签对Bean进行依赖注入,bean的主要标签有两个,id属性用于配置Bean的唯一标识,Bean在注入时,通过该标识查找Bean对象;class为指定完成的Bean类:

<!-- 配置User  -->
	<bean id="user" class="com.lh.entity.User" />
	<!-- 配置TestUtil,注入User -->
	<bean id="testUtil" class="com.lh.util.TestUtil">
		<property name="user">
			<ref local="user"/>
		</property>
	</bean>

<bean>标签中包含一个<property>子标签,Spring会根据<property>的配置实现依赖注入,其中name的属性值与Bean中设置的属性值对应;<ref>用于指定要注入的对象,其local属性值与配置文件中指定的<bean>的id属性对应.

实现输出User对象的属性值

<%
		Resource cr = new ClassPathResource("applicationContext.xml");		//在classpath下读取指定的xml文件
		BeanFactory factory = new XmlBeanFactory(cr);			//定义并建立BeanFactory
		TestUtil testUtil = (TestUtil) factory.getBean("testUtil");			// 指定Bean的名称来取得Bean实例	
 %>
    <%if(testUtil.getUserInfo()){ 
    	User user = testUtil.getUser();
    %>
    	用户名:<%=user.getName() %><br>
    	性别:<%=user.getSex() %><br>
    	年龄:<%=user.getAge() %><br>
    	电话:<%=user.getTel() %><br>
    <%} %>

2.应用构造器注入实现Bean的注入

相对setter实现的注入 TestUtil里多了一个构造方法:

   public class TestUtil {
	
    //省略部分相同代码
	public TestUtil(User user){
		this.user = user;
	}
}


  

在xml中应用<constructor-arg>元素通过构造器实现Bean的依赖注入,在类被实例化的时候,其构造方法将被调用且只能调用一次,因此,构造器常被用于类的初始化

<!--省略部分相同代码-->
<!-- 配置TestUtil,注入User -->
	<bean id="testUtil" class="com.lh.util.TestUtil">
		<constructor-arg >
			<ref bean="user"/>
		</constructor-arg>
	</bean>

当某个业务对象的构造方法同时传入多个参数时,可通过inxde属性指定参数的索引:

<constructor-arg index="0" value="aaa"/>
<constructor-arg index="1" value="bbb"/>

3.应用@Autowird注解实现Bean的注入

@Autowird注解实现依赖注入可以标注与下面4种情况:

1.在构造方法上@Autowird注解;

2将@Autowird注解标注于属性;

3.将@Autowird注解标注于setter之上;

4.将@Autowird注解标注任意方法之上(只要该方法定义了需要注入的参数);

spring配置:

	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

4.@resource注解实现Bean的注入与@Autowird类似

5.零注解实现Bean的注入

<?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-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<context:component-scan base-package="com.lh" />
</beans>

配置完成后context:component-scan会默认扫描com.lh路径下所有标注了相应注解的类,冰添加到ioc容器中,实现依赖注入.默认扫描的注解是@Component

6.为JavaBean的集合对象注入属性值

7.使用prop标签为Java持久属性集注入值 配置jdbc

使用spring提供的<prop>为Java持久化属性集注入值,也就是向java.util.Properties对象中注入值.<props>是简化了的<map>,因为Properier只能指定String类型的key和值,所以<props>的配置只有固定的格式:

<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-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	
	<bean id="testUtil" class="com.lh.util.TestUtil">
		<property name="prop">
			<props>
				<prop key="driver">com.mysql.jdbc.Driver</prop>
				<prop key="url">jdbc:mysql://localhost:3306/test</prop>
				<prop key="username">root</prop>
				<prop key="password">111</prop>
			</props>
		</property>
	
	</bean>
</beans>

8.按照Bean的名称自动装配

<?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-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd">
	<bean id="user" class="com.lh.entity.User" /> 
	<bean autowire="byName" id="printInfo" class="com.lh.util.PrintInfo" />
</beans>

自动装配存在配置出错的可能性,如果配置文件中定义了与需要装配的JavaBean名称相同但是类型不同,就会错误的注入到不同的JavaBean中.

9.按照Bean的类型自动装配

<!--省略其他相同代码-->
<bean autowire="byType" id="printInfo" class="com.lh.util.PrintInfo" />

存在装配失败,例如再添加一个User因无法分辨那个是需要装配的JavaBean抛出异常

beans 的default-autowire 设置全部自动装配默认为no

10.延迟初始化(第一次使用的时候再初始化)

配置文件中单个bean设置lazy-init="true"为延迟初始化.存在失败可能,例如,a对象设置了延迟初始化,b对象没有设置延迟,但是b对象依赖于a对象.那么容器会首先初始化a对象,再初始化b对象.

全局延迟初始化: 在beans上配置 default-lazy-init="true" 会使全部的对象延迟初始化;

11.自定义编辑器实现类型转换

属性编辑器来自于java.bean.PropertyEditor接口,支持各种不同类型显示和更新属性值的方法.当定制与参数对象类型相对应的属性编辑器时,每个属性编辑器都必须编写setValue()方法,都应该有一个空的构造方法.

public class MyDateEditor extends PropertyEditorSupport {
	//设置日期格式方法
    public void setAsText(String text) throws IllegalArgumentException {
        Date date = new Date(text);
        setValue(date);								// 设置日期格式
    }

}

配置文件里配置

<bean id="customEditorConfigurer"
	class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.util.Date">
					<bean id="MyDateEditor" class="com.lh.util.MyDateEditor" />
				</entry>
			</map>
		</property>
	</bean>

12.依赖注入验证用户登录

public class Validation extends AbstractController {
	private User user; //注入User对象

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	 //登录验证 当你用AbstractController类作为你控制器的父类时
	 //只需要改写handleRequestInternal方法,实现业务逻辑并返回ModelAndView对象
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String username=request.getParameter("username"); //从页面获取用户名的值
		String password=request.getParameter("password"); //从页面获取密码的值

		if(username.equals(user.getUsername())&&password.equals(user.getPassword())){
			return new ModelAndView("yes"); //跳转到登录成功页面
		}else{
			return new ModelAndView("error");//跳转到登录失败页面
		}
	}

}

spring中配置User

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
	<!-- 为User对象属性赋值 -->
	<bean id="user" class="com.user.User">
		<property name="username">
			<value>admin</value>
		</property>
		<property name="password">
			<value>111</value>
		</property>
	</bean>
	<!-- 让bean Validation自动装配User并映射do -->
	<bean name="/login.do"  autowire="byName" class="com.validation.Validation">
		<property name="user">
			<ref local="user"/>
		</property>
	</bean>

web.xml中配置applicationContext.xml自动加载

<!-- 自动加载配置Spring的配置文件 -->
  <servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/applicationContext.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

当使用AbstrcatController作为控制器的父类时,只需要改写handleRequestInternal()方法,实现业务逻辑,并返回ModelAndView对象.在配置定义控制器转发视图类InternalResourceViewResolver时,指定property name属性为prefix,表示视图文件的前缀,即目录名;指定property name 属性为suffix,则表示视图文件的后缀名,即扩展名.

demo:链接:http://pan.baidu.com/s/1i5IgY2p 密码:1qwa

猜你喜欢

转载自my.oschina.net/u/3500033/blog/1553465