spring IOC


spring -------------------------------
 
   轻量级容器框架

   ioc(最核心的东西),它把关系都封装好了;
   aop 面向切面编程;代理技术;轻量级会服务;
   ejb 也提供了这项服务,但是它是重量级服务;

   比如:hibernate 中的session就交给spring来管了,spring就向一个大总管,什么郚它都管了。


spring 架构图:所有的服务都依赖于容器;

ssh  主要是对hiternate和struts的集成;

------------------spring---ioc 学习--------------------------------------

1。  建立相应的dao和manager(前台页面业务逻辑)

      dao层接口、实现
     
       mangage层(业务逻辑层)接口、实现

       关于接口层与实现层我们可以人为写死的,但一个业务逻辑依赖好几个dao呢,我们就得把全部用得上的全部装配上,
由此我们引出 ioc (控制反转)。
      
       IOC 控制反转:你别做这个信赖关系了,交给spring,由它去处理;可是使用这种服务是要有前提的:必需给相应dao接口
给相应的构造函数,也可以生成得到、set方法;这种形式这称为依赖注入,控制反转。

       注入:是主动给的,假设:你要追尔一个女孩,你是主动,你依赖于它;你发起的,你就依赖于别人,反过来,她追你;主动给的你,我们并没有信赖于它
它没有琴入性,你离开了,他不受什么影响。


-------ioc-----spring----相关配置----------------------------------

spring相关配置相关jar spring最核心的jar 是相关dist文件夹的下的  spring。jar
  和两个日志包:common:log4j.jar  logg-common。jar

  在sspring解压过文件中复制applicationContext.xml/和log4j.jar

  配置dao:

     *************《关于构造函数的注入在applicationContext中的<bean>

   <contr

</bean>


客户端加载: BeanFactory factory=newClassPathApplication("相关spring配置");
             factory。getBean("取出你要的产品"); spring在给你的时候它把所有实例都给我们创建好了。

 使用spring它为我们做了很多事,使我们更专注业务。

  用set方法注入和构造函数注入之区别:使用构造函数它被调用的时机比较早,一在类加载的时候就把dao加载进来一,而set是在实例化之后,才来注入的.
  它们区别就在时机上面已,具体情况而定

   spring ioc应用的是di依赖注入,依来注入是别人创建好了来给你。   但并不是说所有的实例都由它来创建军。

   使用spring ioc 会使我们的程序比较清晰。spring没有侵入性,这是一个轻量级框架

    为什么都使用轻量级的,因为它不信依赖于容器。

-------------属性注入------------------------
只要我们给这个类提供构造函数和set方法,我们就可以把它注入进去。

日志目录,如果没有明确给出,就会在你相应的工程下,建立一个web-inf的文件,里面就是程序运行时的日志文件。

属性注入方法:在applicationContext。xml中

    《bean id="合法的名称" class=“该属性名所在的类(action)”>

           因为是set注入
                   《property  name===“在类中和action中的属性名称set后面的属性名称” value="123"/》//这样的话就注入进去了。

                     别一种方式;(int 型)<property name="在类中和action中的属性名称set后面的属性名称">

                                   <value>123</value>
                                   </property>

 

     </bean>

        map在bean中注入用的是《map 》
                           <entriy key="k1" value="v1">
                           <entriy key="k2" value="v2">

                   《/map>


如工程比较大,都气配置文件放在一个文件中,会有点太乱,spring是可以分文件来管理的(也就是分文件)。

对于多文件的我们可以给所有spring一个约定:然后用通配匹配:如所的spring文件都 是applicationContext头的,我们可以这样来事实定义

applicationContext_*;
例如:applicationContext_beans。xml
      applicationCOntext_beans1.xml
--------------------------日期注入----------如果按照上面的形式来注入,那么注入就会有问题的,在struts中它提供了conterter,在spring中提供了自定义属性编辑器


作用spring属性编缉器,在类继乘的时候,要继成javabean下面的东西.然后把相应属性转换注入进来 ----方法:

  属性编辑器,把相应的字符串转换成相应的对象注入。spring有内制的属性编辑器,我们右以自己定义,继成一个类,propertyeditsupport然后复写AsText参见
 
  spring类型转换原理:把相应的类型交给弹跳去管理。关于日期的有点特别:需要运用人为调用一下弹跳的属性编辑器方法格式化一下该日期。

 spring 关于日期转换:事例:


   定义一个属性转换器:com.test.property.UtildateProperty.java

   
public class UtildateProperty extends PropertyEditorSupport {

    private String format="yyyy-MM-dd";
 public void setAsText(String text) throws IllegalArgumentException {
 
    System.out.println("UtildateProperty 属性编辑器text="+text);
   SimpleDateFormat  sdf=new SimpleDateFormat(format);
    try {
   Date d=sdf.parse(text);
   this.setValue(d);
  } catch (ParseException e) {
   e.printStackTrace();
  }
  
 }
 public void setFormat(String format) {
  this.format = format;
 }


 
 
 
}
在applicationContext-beans.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"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
   
   
   <bean id="bean1" class="com.test.property.Bean1">
   
        <property name="mapValue">
     
           <map>
              <entry key="k1" value="map1"/>
              <entry key="k2" value="map2"/>
           </map>
     
      </property>   
     
      <property name="strValue" value="string"/>
     
      <property name="dateValue">
           <value>2008/09/09</value>
     
      </property>
     
   
   </bean>

</beans>

针对日期转换相关xml文件applicationContext-utilDate.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"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 <!-- 需要把它注入到一个spring的类里 定义一个属性编辑器-->
 <bean id="customEditorConfigurer"
  class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">//这个属性来自CustomEditorConfigurer类中的一个map属性
   <map>
    <entry key="java.util.Date">

     <bean class="com.test.property.UtildateProperty">
        <property name="format" value="yyyy/MM/dd"></property>
     </bean>//为了适应各类时间格式,我们利用注入的方式把日期格式注入一下,然后在bean中指定一下就可以用了。这就是spring IOC 的强大之处。

    </entry>

   </map>
  </property>
 </bean>

</beans>
-----------------------------------------spring公共策略---------------------------

把几个类中的相同属性拿出来,定义成一个抽象的《bean》如:

   <bean id="Abstract" abstract="true">
     把相同属性配制在这里如:
    写的方法和来的属性方法一致《用property》
   </bean>
当相你关类加载属性时可以这样来做:

      《bean id="bean2" class="com.test.beans.bean2" parent="Abstract"》
            然后在里面加上它的扩展属性,就是在本类中有的,在人为定义的抽象类中没有有

     《/bean>

**依赖注入有好几种方式:


  ref属性
  《ref》标签
  内部bean
----------------------------spring bean的作用域(scope)-----------------------------

作用域就是,当我们每次getBean的时候,spring每次给我们创建一个实例呢,还是怎么的呢?

请看下面的例了:

    比如:Bean1 bean1=new ClassPathApplicationContext("applicationContext.xml");
          Bean1 bean2=new ClassPathApplicationContect("applicationContext.xml");
           if (bean1==bean2)
               {
                     System.out.println("bean1==bean2");
               }
            else{
                        System.out.println("bean1!=bean2");
             }
所以对spring对bean的初始化只有一次,初始化一次,就不在初始化了。


  每个bean都有有它的相关属性: <bean id="bean1" class="com.test.property.Bean1" scope=”“>
   如果不写,它的默认值是singleton,作用域就是spring对bean只初始化一次,每次调用的时候返回相同的实例。另一属性:prototype;它的意思就是每次getBean的时候它就会给我们重新创建军一次。
   每次调用的时候返回不同的实例。
-----------------------spring自动装配=-----------------------------

它的主要作用就是:简化代码编写,有利于提高开发效率
  根据名称的自动装配:主要是开发效率:写法:在applicationContext。xml:尖括号内加一个属性:default-autowier=”byName“它指对本文件生效
  前提,约定要一定。

根据类型装配:如果按类型装配,那和无论相应id的值怎么变都不会影响class的加载
--------------------------ioc这一块结束-------------------------------------------
ioc就向一个大型的抽象的工厂,但它比抽象工厂更复杂。它有关系注入。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值