spring ioc容器

来源:互联网 发布:php重载和重写的区别 编辑:程序博客网 时间:2024/04/30 13:19

spring ioc容器

1.ioc容器的解释

         ioc容器的产生就是要解决在面向对象编程的时候对象之间的耦合度过高的问题,我们编程通常是在一个类中不断的来new另一个类,以达到我们要的逻辑目的。但是这样的话耦合度过高,一处出错导致多处瘫痪。为此软件专家Michael Mattson提出了IOC理论,以达到解耦的目的。下面介绍ioc的依赖注入(控制反转)。

如图1:在没有使用ioc容器前对象A依赖B,A如果要使用B就要自己主动创建或者使用已经创建的对象B。这样耦合度高




         图一

如图二:IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,第三方指的就是ioc容器。图三:当把ioc容器拿掉A与B就失去了直接的联系。所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦


         图二


             图三

2.依赖注入的方式

(1)设值注入
解析xml配置文件即<property></property>标签,利用set方法设值注入,这里bean中必须要有set方法。

(2)构造注入

解析xml配置文件即<constructor-arg>

</constructor-arg>,

利用构造方法设值注入,这里bean中必须要有构造方法。

下面是我的xml配置文件以及我的两个bean,这样就将InjectionDAOImpl这个bean注入到了InjectionServiceImpl中

(1)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"    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd" >        <!--   <bean id="injectionService" class="com.wjn.ioc.injection.service.InjectionServiceImpl"> --><!--         <property name="injectionDAO" ref="injectionDAO"></property> --><!--    </bean> -->        <bean id="injectionService" class="com.wjn.ioc.injection.service.InjectionServiceImpl">        <constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>        </bean>                <bean id="injectionDAO" class="com.wjn.ioc.injection.dao.InjectionDAOImpl"></bean> </beans>



(2)演示的第一个bean
public class InjectionServiceImpl {private InjectionDAO injectionDAO;//构造器注入 public InjectionServiceImpl(InjectionDAO injectionDAO1) {this.injectionDAO = injectionDAO1;}//设值注入public void setInjectionDAO(InjectionDAO injectionDAO) {this.injectionDAO = injectionDAO;}public void save(String arg) {//模拟业务操作System.out.println("Service接收参数:" + arg);arg = arg + ":" + this.hashCode();injectionDAO.save(arg);}}


(3)演示的第二个bean,以及接口InjectionDAO
public class InjectionDAOImpl  implements InjectionDAO{public void save(String arg) {//模拟数据库保存操作System.out.println("保存数据:" + arg);}}接口public interface InjectionDAO{public void save(String arg) ;}


3.spring容器提供的方法

  bean 是Spring 管理的基本单位,Spring 里的bean 是非常广义的概念,任何的Java对象,Java 组件都可被当成bean 处理。甚至这些组件并不是标准的JavaBean。bean 在Spring 容器中运行时,无须感受Spring容器的存在,一样可以接受Spring 的依赖注入,包括bean 属性的注入,合作者的注入及依赖关系的注入等。

  Spring 的容器最基本的接口就是:BeanFactory。BeanFactory 负责配置、创建及管理bean,它有个子接口: ApplictionContext ,因此也被称为Spring 上下文。另外,Spring容器还负责管理bean与bean之间的依赖关系。 BeanFactory 接口包含如下的基本方法。 

 (1)public boolean containsBean(String name):判断Spring 容器是否包含id 为name 的bean 定义。 

 (2)public Object getBean(String name):返回容器id 为name 的bean 。

 (3)public Object getBean(String name, Class requiredType):返回容器中id 为name ,并且类型为required可pe 的bean 。 

 (4)public Class getType(String name) :返回容器中id 为name的bean的类型。

 调用者只需使用getBean 方法即可获得指定bean的引用,无须关心bean 的实例化过程。即bean 实例的创建过程完全透明。 BeanFactory有很多实现类,通常使用org.springframework.beans.factory.xml.XmlBeanFactory 类。但对大部分J2EE 应用而言,推荐使用ApplicationContext,因为其是BeanFactory 的子接口,其常用的实现类是org.springframework.context.support.FileSystemXmlApplicationContext。 创建BeanFactory的实例时,必须提供Spring 容器管理bean的详细配置信息。Spring的配置信息通常采用XML 配置文件来设置。因此,在创建BeanFactory 实例时,应该提供XML 配置文件作为参数。

spring 常用的aware接口

4.获取spring applicationcontext方式

方法一:在初始化时保存ApplicationContext对象
代码:
ApplicationContext ac = new FileSystemXmlApplicationContext(”applicationContext.xml”);
ac.getBean(”beanId”);

说明:
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。


方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:

import org.springframework.web.context.support.WebApplicationContextUtils;ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContextsc)ac1.getBean(”beanId”);ac2.getBean(”beanId”);
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后

在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。


方法三:继承自抽象类ApplicationObjectSupport
说明:
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationCont

ext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext

context)方法将ApplicationContext 对象注入。

 

方法四:继承自抽象类WebApplicationObjectSupport
说明:
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

 

方法五:实现接口ApplicationContextAware
说明:
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对

象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。

5.常用aware接口

1.ApplicationContextAware

可以将我的spring applicationContext容器注入到我的bean中从而我们可以获取当前的applicationcontext对象从而使用它的方法。

ApplicationContextAware接口有一个方法

public void setApplicationContext(ApplicationContext apc){

apc.getbean("获取你要得到的bean");

}

2.BeanNameAware接口

本接口的目的是获取bean在bean工厂中的name值,也就是applicationContext中配置的<bean></bean>的name属性

public void setBeanName(String name){

System.out.println(name);
}


1 0
原创粉丝点击