Spring框架的各个部分都充分使用了依赖注入技术,它使代码不再有单实例垃圾,也不再有麻烦的属性文件,取而代之的是一致和优雅的程序代码。它也是Spring中非常重要的核心技术之一。
一、什么是控制反转与依赖注入
IoC的英文全称是Iversion of Control,既控制反转。它使程序组件或类之间尽量形成一种松耦合的结构。开发者在使用类的实例之前,需要先创建对象的实例。但IoC将创建实例的任务交给IoC容器。
依赖注入有3种实现类型,Spring支持后两种
**接口注入
接口注入基于接口将调用与实现分离。这种依赖注入方式必须实现容器所规定的接口,使用程序代码和容器API绑定在一起,这不是理想的依赖注入方式。
**setter注入
setter注入基于JavaBean的setter方法为属性赋值。在实际开发中得到了最广泛的应用
public class User{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
**构造器注入
public class User(){
private String name;
public User(String name){
this.name = name;
}
}
二、Bean的配置
想要在Spring IoC容器中获取一个bean,首先要在配置文件中的<beans>元素中配置一个了元素<bean>,Spring的控制反转机制会跟据<bean>元素的具体配置来实例化这个bean实例
<bean id="test" class="com.mrTest">
其中,id属性为bean的名称,class属性为对应的类名,这样,通过BeanFactory容器的getBean("test")方法就可以获取到该类的实例。
三、Setter注入
public class User{
private String name;
private Integer age;
private String sex;
//省略set、get方法
}
在Spring的配置文件applicationContext.xml中配置该JavaBean
<bean name="user" class="com.mr.User>
<property name="name">
<value>小说</value>
</property>
<property name="age">
<value>25</value>
</property>
<property name="sex">
<value>男</value>
</property>
</bean>
Resource resource = new ClassPthResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
User user = (User)factory.getBean("user");
System.out.pritnln("用户姓名-----"+user.getName());
System.out.println("用户年龄----"+user.getAge());
System.out.println("用户性别-----"+user.getSex());
四、构造器注入
public class User{
private String name;
private Integer age;
private String sex;
public User(String name,Integer age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public void printInfo(){
System.out.println("用户姓名-----"+name);
System.out.println("用户年龄-----"+age);
System.out.println("用户性别-----"+sex);
}
}
在Spring的配置文件applicationContext.xml中配置该JavaBean
<bean name="user" class="com.mr.User>
<property name="name">
<value>小说</value>
</property>
<property name="age">
<value>25</value>
</property>
<property name="sex">
<value>男</value>
</property>
</bean>
Resource resource = new ClassPthResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
User user = (User)factory.getBean("user");
user.printInfo();
由于大量的构造器参数可能使程序变得效率低下,特别是当某些属性是可选的时候,,但是构造器注入方式也有自己特点,它一次性将所胡依赖注入,也就是说,在程序未完全初始化的状态下,注入对象不会被调用,此外对象也不可能再次重新注入。对于注入类型的选择并没有硬性的规定,对于那些没有源代码的第三方类,或者没有提供Setter方法的遗留代码,只能选择构造哭注入方式实现依赖注入。
五、引用其他的Bean
在Spring中,可以通过配置文件使用<ref>元素引用其它JavaBean的实例对象
public class Manger extends AbstractController{
private User user;
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
protected ModelAndView handRequestIntermal(HttpServletRequets arg0,HttpServletResonse arg1)throw Excpetion{
user.printInfo();
return null;
}
}
(1)控制器AbstractController:AbstractController是Spring中最基本的控制大器,所有Spring控制器都继承了AbstractController控制器,它提供了诸如缓存支持和mimetype设置这样的功能.
(2)handleRequestInternal()抽象方法:当从AbstractController继承时,需要实现handleRequestInternal()抽象方法,该方法将用来实现自己的逻辑,并返回一个ModelAndView对象
applicationContext.xml
<bean name="/main.do" class="com.mr.Manger">
<propery name="user">
<ref local="user"/>
</propery>
</bean>
<!-- 设置自动加载配置文件 -->
<servlet>
<servlet-name>dispatcherServlet></servlet-name>
<init-param>
<param-name>contextConfigLocation></param-name>
<param-name>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dispatcherServelt></servlet-name>
<url-pattern>*.do</url-pattern>
</servlet>
六、匿名内部JavaBean的创建
<!-- 定义学生匿名内部类 -->
<bean id="school" class="School">
<property name="student">
<bean class="Student"/>
<property>
</bean>