`

IoC容器

阅读更多
IOC控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。
依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中。
-----------------------------------------------------------------------------
第一个项目
1    spring的依赖库
     * SPRING_HOME/dist/spring.jar
     * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
     * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
     如果使用了切面编程(AOP),还需要下列jar文件
     * SPRING_HOME/lib/aspectj/aspectjweaver.jar和aspectjrt.jar
     * SPRING_HOME/lib/cglib/cglib-nodep-2.1_3.jar
     如果使用了JSR-250的注解,如@Resource/@postConstruct/@preDestroy,还需要下列jar文件
     * SPRING_HOME/lib/j2ee/common-annotations.jar
2    拷贝spring配置文件到src下
3    拷贝log4j配置文件到src下
4(1) 在UserManager中提供构造函数,spring将实例化好的UserDao实现注入给我们
public class UserManagerImpl implements UserManager {
                
private UserDao userDao;
                
public UserManagerImpl(UserDao userDao){
                    
this.userDao=userDao;
                }

                
public void save(String username, String password) {
                    
this.userDao.save(username, password);
                }

          }
4(2) 在UserManager中提供set方法,spring将实例化好的UserDao实现注入给我们
public class UserManagerImpl implements UserManager {
                
private UserDao userDao;
                
public UserDao getUserDao() {
                    
return userDao;
                }

                
public void setUserDao(UserDao userDao) {
                    
this.userDao = userDao;
                }

                
public void save(String username, String password) {
                    
this.userDao.save(username, password);
                }

         }
5    让spring管理我们的对象创建和依赖,必须在spring配置文件中(applicationContext.xml)进行定义
     * 构造函数
<bean id="userDao4MySqlImpl" class="com.my.spring.dao.UserDao4MySqlImpl"/>
       
<bean id="userDao4OracleImpl" class="com.my.spring.dao.UserDao4OracleImpl"/>
       
<bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
            
<constructor-arg ref="userDao4MySqlImpl"/>
            //
<constructor-arg index="0" type="com.my.spring.dao.UserDao4OracleImpl" ref="userDao4MySqlImpl"/>
       
</bean>
       * set方法
       方法一:
       
<bean id="userDao4MySqlImpl" class="com.my.spring.dao.UserDao4MySqlImpl"/>
       
<bean id="userDao4OracleImpl" class="com.my.spring.dao.UserDao4OracleImpl"/>
       
<bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
            
<property name="userDao" ref="userDao4OracleImpl"/>
       
</bean>
       方法二(使用内部bean)
       
<bean id="userManagerImpl" class="com.my.spring.manager.UserManagerImpl">
            
<property name="userDao">
                 
<bean class="com.my.spring.manager.UserManagerImpl">
            
</property>
       
</bean>
* 注解方式
      1 头文件中必须加入
xmlns:context="http://www.springframework.org/schema/context"
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
          
<context:annotation-config/>//开启注解
2 在java代码中使用@Autowired或@Resource注解方式进行装配,它们区别是:
         * @Autowired默认按类型装配,默认情况下要求依赖对象必须存在,如果允许null值,可以设置它required为false,
         如果想使用按名称装配,可以结合@Qualifier注解一起使用,如下:
            @Autowired @Qualifier("userBean")
            private User user;
         * @Resource默认按名称装配,找不到匹配的bean才会按类型装配。它和@Autowired一样可以标注在字段或属性的setter方法上。
         可以通过name属性指定名称,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称为name属性名称,当注注解
         标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
         注意:一旦指定了name属性,就只能按名称装配了。
            @Resource(name="userBean")
            private User user;
6    实例化spring容器并调用相关方法
     //ApplicationContext ctx=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
     BeanFactory factory =new ClassPathXmlApplicationContext("applicationContext.xml");
7    获取bean
UserManager userManager=(UserManager)ctx.getBean("userManagerImpl");
       UserManager userManager
=(UserManager)factory.getBean("userManagerImpl");

8    调用业务码
    userManager.save("张三", "123");
spring IoC容器的关键点:
     * 必须将被管理的对象定义到spring配置文件中
     * 必须定义构造函数或setter方法,让spring将对象注入过来
手动添加schema文件,方法如下:
windows->preferences->myeclipse->files and editors->xml->xmlcatalog

-------------------------------------------------------------------------------------------------------------------
普通属性的注入
  *多个配置文件可以放入String[]数组中,调用factory=new ClassPathXmlApplicationContext(String[] array);
  *多个配置文件可以使用*通配符,(测试未成功)factory=new ClassPathXmlApplicationContext("applicationContext-*.xml");
  *可以将一个类分成多个配置文件进行配置,但id不能相同
示例:

Beans:
private String strValue;
    
private int intValue;
    
private List listValue;
    
private Set setValue;
    
private String[] arrayValue;
    
private Map mapValue;
    
private Properties properties;
applicationContext-beans.xml
<bean id="beans" class="com.my.spring.Beans">
        
<property name="strValue" value="Hello"/>
        
<property name="intValue">
            
<value>123</value>
        
</property>
        
<property name="listValue">
            
<list>
                
<value>list1</value>
                
<value>list2</value>
            
</list>
        
</property>
        
<property name="setValue">
            
<set>
                
<value>set1</value>
                
<value>set2</value>
            
</set>
        
</property>
        
<property name="arrayValue">
            
<list>
                
<value>array1</value>
                
<value>array2</value>
            
</list>
        
</property>
        
<property name="mapValue">
            
<map>
                
<entry key="k1" value="v1"/>
                
<entry key="k2" value="v2"/>
            
</map>
        
</property>
        
<property name="date">
            
<value>2008-08-15</value>
        
</property>
        
<property name="properties">
            
<props>
                
<prop key="key1">value1</prop>
                
<prop key="key2">value2</prop>
                
<prop key="key3">value3</prop>
            
</props>
        
</property>
    
</bean>
调用:
private BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext-beans.xml");
        Beans b
=(Beans)factory.getBean("beans");
        System.out.println(b.getIntValue());
        System.out.println(b.getStrValue());
        System.out.println(b.getArrayValue());
        System.out.println(b.getListValue());
        System.out.println(b.getMapValue());
        System.out.println(b.getDate());

---------------------------------------------------------------------------------------------
自定义属性编辑器
*作用:将spring配置文件中的字符串转换成相应的对象进行注入
       spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
*定义方法:
       1 继承PropertyEditorSupport类,复写setAsText()方法
       2 将属性编辑注册到spring中
1 编写自定义处理类
public class UtilDatePropertyEditor extends PropertyEditorSupport {
    
private String format="yyyy-MM-dd";
    @Override
    
public void setAsText(String text) throws IllegalArgumentException {
        SimpleDateFormat sdf
=new SimpleDateFormat(format);
        
try {
            Date d
=sdf.parse(text);
            
this.setValue(d);
        }
 catch (ParseException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    
public String getFormat() {
        
return format;
    }

    
public void setFormat(String format) {
        
this.format = format;
    }

}
2 配置apllicationContext-edition.xml
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        
<property name="customEditors">
            
<map>
                
<entry key="java.util.Date">
                    
<bean class="com.my.spring.UtilDatePropertyEditor"/>
                
</entry>
            
</map>
        
</property>
</bean>
3 调用
String[] contexts=new String[]{"applicationContext-beans.xml","applicationContext-edition.xml"};
        factory
=new ClassPathXmlApplicationContext(contexts);

-----------------------------------------------------------------------------------------------------
公共属性的注入
依赖对象的注入方法,可以采用:
 * ref属性
 * <ref>标签
 * 内部<bean>来定义
<bean id="beans2" class="com.my.spring.Beans2">
        
<property name="beans3">
            
<ref bean="beans3"/>
        
</property>
        
<property name="beans4" ref="beans4"/>
        
<property name="beans5" ref="beans5"/>
</bean>
如何将公共的注入定义描述出来?
 * 通过<bean>标签定义的属性,指定abstract="true"
 * 具有相同属性的类在<bean>标签中指定其parent属性
<bean id="beanAbstract" abstract="true">
        
<property name="id" value="1000"/>
        
<property name="name" value="jack"/>
</bean>
    
<bean id="beans3" class="com.my.spring.Beans3" parent="beanAbstract">
        
<property name="password" value="8888"/>
</bean>

<bean id="beans4" class="com.my.spring.Beans4" parent="beanAbstract"/>

<bean id="beans2" class="com.my.spring.Beans2">
        
<property name="beans3">
            
<ref bean="beans3"/>
        
</property>
        
<property name="beans4" ref="beans4"/>
        
<property name="beans5"color: #ff000
分享到:
评论

相关推荐

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

    IoC容器的设计(利用反射、注解和工厂模式实现)

    2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的对象 @Configuration 标注为配置类 @ComponentScan ...

    IOC容器简单实现

    **IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...

    Spring IOC容器实现分析.pdf 下载

    《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...

    Spring IoC容器实现的结构分析

    Spring IoC容器是Spring框架的核心,它负责管理应用对象的生命周期和依赖关系。通过对IoC(Inversion of Control,控制反转)的实现,Spring容器将对象的创建和组装工作从应用代码中分离出来,使得应用更易于测试和...

    Spring源代码解析(一):IOC容器.doc

    在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...

    模拟Spring的IoC容器实现注解自动装配

    IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试和可维护。而注解自动装配(Autowired)是Spring IoC容器的一种高级特性,它允许我们通过注解来声明对象之间...

    简单IOC容器demo

    【标题】:“简单IOC容器demo”是一个演示性的项目,它旨在教授如何构建一个基础的控制反转(IOC)容器。这个容器使用注解来实现依赖注入,这是Spring框架的核心特性之一。 【描述】:该示例项目是学习过程的产物,...

    MVC与IOC容器互动

    **MVC模式与IOC容器互动详解** MVC(Model-View-Controller)模式是一种软件设计模式,常用于构建Web应用程序,以实现业务逻辑、数据处理和用户界面的分离。在这个模式中,Model代表数据模型,负责处理应用程序的...

    IoC 容器和Dependency Injection 模式

    ### IoC 容器与 Dependency Injection 模式详解 #### 一、IoC 容器的概念及重要性 IoC(Inversion of Control,控制反转)容器是现代软件开发中的一项关键技术,尤其在 Java 社区中备受关注。它允许程序员以一种...

    手写一个SpringIoc容器

    本项目"手写一个SpringIoc容器"旨在模仿Spring的IOC(Inversion of Control,控制反转)功能,帮助开发者深入理解Spring的工作原理,提升对依赖注入(Dependency Injection)模式的认识。 在实现自定义的Spring IOC...

    IOC容器_原理代码

    **IOC容器原理与实现** IOC(Inversion of Control),即控制反转,是软件设计模式中的一种核心概念。在Java开发中,Spring框架是最为著名的实现IOC的库。它改变了传统程序设计中对象间的依赖关系创建方式,将对象...

    Spring的IoC容器初始化源码解析

    ### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...

    Spring IOC容器应用实例

    **Spring IOC 容器应用实例** Spring 框架的核心组件之一是 Inversion of Control (IoC) 容器,也常被称为依赖注入(Dependency Injection)容器。IoC 是一种设计模式,它将对象的创建和管理从应用程序的业务逻辑中...

    自己实现的ioc容器

    IoC容器负责管理对象的生命周期和对象间的依赖关系,从而降低了代码的耦合度,提高了可测试性和可维护性。现在我们来详细探讨一下如何从零开始,用纯Java实现一个简单的IoC容器。 首先,我们要理解IoC的概念。IoC是...

    手动实现一个ioc容器.zip

    标题 "手动实现一个IOC容器.zip" 提到的主题是关于如何从零开始构建自己的依赖注入(Dependency Injection,简称DI)容器,这在Java开发中尤为重要,特别是对于Spring框架的理解和学习。IOC容器是Spring的核心功能之...

    一个简单的IOC容器实现

    本文将深入探讨一个简单的IOC容器实现,帮助我们理解DI的基本原理。 首先,理解IOC的概念至关重要。在传统的编程模式中,对象通常自行创建依赖的对象,这导致了代码之间的紧密耦合。而在IOC模式下,容器负责管理...

    自己实现IOC容器

    在Java领域,Spring框架的IOC容器是最为广泛应用的实现之一。当我们自己动手实现IOC容器时,可以更深入地理解其内部的工作机制。 ### 1. IOC基本原理 **控制反转**的核心思想是将对象的创建和管理权交给容器,而...

Global site tag (gtag.js) - Google Analytics