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