zoukankan      html  css  js  c++  java
  • Spring IoC 的基本使用

    〇、关于spring

    1. spring是一个容器,装对象和对象关系的容器
    2. spring核心技术有IOC(控制反转)和AOP(面向切面编程)

    IOC

    一、IoC容器的初始化过程

    1.资源定位(配置文件);

    2.Bean信息的载入(将配置好的信息转化成spring内部表示的数据结构);

    3.对bean配置属性解析;

    4.解析好的bean在IoC容器注册(提供更友好的使用方式);

    二、依赖注入

    实例化用户索要的bean;

    把bean之间的依赖关系设置好;

    三、bean生命周期

    当使用ApplicationContext时:ApplicationContext启动->实例化bean->为属性赋值->前置处理器->bean指定初始化方法->后置处理器->使用bean->bean的销毁方法;

    当使用BeanFactory时:在getBean()之后进行上述过程;

    四、bean配置

    1. 属性配置

    <bean id=”” class=””>

       <property  name=”属性名”  value=”值”></property>

    <property  name=”属性名”  ref=”引用另外bean的id”></property>

    </bean>

    属性配置,要在javabean里面有该属性的set方法;

    得有个无参构造方法;

    Property标签 可以使用type属性指定其数据类型;

    1. 构造器配置

    <bean id=”” class=””>

       <constructor-arg value=”参数值”></constructor-arg>

       <constructor-arg ref=”引用另外bean的id”></constructor-arg>

    </bean>

    可以使用type属性设置其数据类型

    1. 级联属性赋值

    <bean id=”” class=””>

       <constructor-arg  ref=”引用另外bean的id”></constructor-arg>

       <property  name=”(另外bean的id).(其属性)”  value=”值”></property>

    </bean>

    使用级联时,注意要先将级联的bean初始化

    1. 内部bean

    <property  name=”一个要引用的bean”>

      <bean class=””>

      ……

      </bean>

    </property>

    将内部的bean赋值给property;

    内部bean只能在内部使用;

    1. 特殊字符

    若有一些xml文档会默认解析的字符(如<>),可以使用<![CDATA[]]>

    <property name=””>

      <value><![CDATA[<hello>]]></value>

    </property>

    1. Null值

    使用<null/>

    1. 配置有List属性的bean

    <property name=”类型为List的属性名”>

       <list>

         <ref bean=”bean的id”/>

              //基本数据类型使用value

         //也可以使用一个内部bean

    </list>

    </property>

    1. 配置有Map属性的bean

    <property name=”类型为map的属性名”>

       <map>

         <entry key=”key值” value-ref=”引用的类型的键值”></entry>

    </map>

    </property>

    1. 将集合数据提取出来,以供多个bean重用(以list为例)

    //要先引入util命名空间

    <util:list id=”该集合数据的id”>

      <ref bean=”一个bean的id”>

      //基本数据类型使用value

    </util:list>

    在bean配置中,属性就写成如下:

    <property name=”类型为List的属性名” ref=”集合数据的id”></property>

    1. 通过p命名空间,简写为bean属性赋值

    //先引入p命名空间

    <bean id=”bean的id”  class=”该bean的类路径”  p:第一个属性名=”值” 

    P:第二个属性名=”值”  p:第三个属性名-ref=”引用bean的id” …..>

    </bean>

    1. 自动装配

    在bean中加入autowire="byType" 或者autowire="byName",可以自动匹配类型相同的参数或者名字相同的参数,不过要是无响应参数则返回null,有多个相应参数则报错;

     

    1. 作用域

    每一个bean默认是单例(singleton)的,在容器初始化时自动地创建了bean实例,然后在每次向容器要bean时都是同一个实例;

    在bean中加入scope属性,值设为”prototype”,即(scope=”prototype”),就只会在向容器索取bean时才创建bean实例,并且是每次不同的实例;

    1. 使用外部配置文件

    先引用context命名空间,然后使用

    <context:property-placeholder location="classpath:配置文件路径"/>

    把外部的配置文件引用进来,再使用${“键“}使用外部配置文件中的数据;

    1. 使用SpEL为bean赋值

    可以在值中,写入#{数字},#{”字符串”},#{true/false},#{T(静态类).方法},

    #{+-*/},其它bean或其他bean的方法#{beanID}、#{beanID.属性},#{beanID.方法()},#{逻辑判断(><==?:)},正则表达式;

    1. Bean生命周期中的指定初始化方法、指定销毁方法,所有bean的前置/后置处理器

    1.在bean配置中使用init-method=“bean的某个方法”,在bean实例化完成、属性赋值完成之后,会调用这个’ bean的某个方法’;destroy-method同理;

      2.新建一个类,实现‘BeanPostProcessor’接口,该接口中有两个方法,其中postProcessBeforeInitialization(参数1,参数2)为前置处理器,在运行指定的初始化方法之前会先运行该方法,参数1为bean本身,参数2为bean的ID;同理,postProcessAfterInitialization(参数1,参数2)在运行指定的初始化方法之后执行;

    每个bean初始化都会调用同一个前置/后置处理器,要使用前/后置处理器,得在配置文件中写入<bean class=”实现处理器接口的类的路径”></bean>

    1. 工厂方法配置bean

    1.调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节;

    2.新建一个工厂类,将需要使用的bean在工厂的无参构造函数或静态代码块中实例化,并把实例存在工厂类的一个map里(键位bean名,值为bean本身),而后在工厂类使用getBeanName(参数)的方法来获取bean(称这个方法为工厂方法);

    3.(1)通过静态工厂方法获取bean:工厂方法要使用static字段,然后在配置文件中配置工厂类的bean,

        <bean id=”beanID” class=”工厂类路径” factory-method=”getBeanName”>

        使用<constructor-arg value="beanName" />属性来获取指定的bean

        使用<property name="要使用的bean里的字段" value="值" />属性来为bean属性赋值

    (2)通过实例工厂方法获取bean:工厂方法不需要使用static关键字;

    先独自配置工厂类的bean:<bean id=”工厂类ID” class=”工厂类路径” />

    然后逐一配置需要使用的bean,在bean中使用factory-bean=" " 和factory-method=" "指定工厂beanID和工厂方法,< constructor-arg >属性和<property>属性使用同上;

    1. 通过FactoryBean配置bean
      1. 创建一个bean,并实现FactoryBean<T>接口;
      2. 可以在bean内写字段或其它方法;
      3. 配置好bean后,在程序中每次获取这个bean其实都是调用了FactoryBean<T>接口的getObject()方法;
      4. 所以你想要返回什么样的bean就在getObject()方法中做操作
    1. 注解配置
      1. 要使用注解前,在xml配置文件中写入组件扫描器:

    (1)<context:component-scan base-package="包名"  resource-pattern=”指定扫描的类(该属性可不写)”>

    </context:component-scan>

    (2)IOC容器会扫描该包和该包子包的注解了的类、字段、方法;

    (3)其中,该标签有<context:include-filter type=” annotation/assignable” expression =”注解类路径/bean类路径”>用此标签指定需要的目标类(annotation表示以指定注解方式,assignable表示以指定类方式),该标签与context:component-scan内部属性use-default-filters="true/false"一起使用,当use-default-filters为false时,IOC只会扫描context:include-filter指定的注解或者类;其它的注解或者类不在扫描,当它们没配置;

    (4) <context:exclude-filter type=” annotation/assignable” expression =”注解类路径/bean类路径”>同理,表示不包含某注解或某类,不需要和use-default-filters="true/false"一起使用;

     

    1.在需要配置成bean的类上写上(@Component、@Repository、@Service、@Controller)四个注解是等效的,其中@Component泛指bean组件,当bean不好归类时,用这个;之所以有四个等效的bean组件注解,因为在三层架构中很容易看出后 3 个注解分别和持久层、业务层和控制层(Web 层)相对应;

    2.属性或者方法的参数使用@Autowired来注入依赖,@Autowired会自动找到类型相同的bean(当有多个类型相同的bean时,会根据变量名来找相应的bean名,当变量名都一样时,使用@Qualifier("bean唯一ID"));

    3.@Resource与@Autowired功能类似,只不过@Resource要指定一个bean名;

    4.@Value(“”)用在基本类型属性上,赋值;

    5.@Scope(“”)指定bean的作用域,同XML;

    6.@PostConstruct指定初始化方法,@PreDestroy指定销毁方法;

    1. 泛型的注解注入

    使用@Autowired

    1. 用一个java类来充当配置文件

    (1)首先新建一个类,在类上使用@Configuration表明该类为配置类

    (2)在类中定义方法,方法返回的是bean的实例对象(return new XXBean),在该方法上加上@Bean(name=”beanID”),表示该方法为一个bean(等同xml配置文件中的一个<bean></bean>),该属性的属性赋值使用bean的带参构造器即可(new XXBean(参数1,参数2….));

    (3)当bean内有需要注入的其它对象时,在@Bean中使用autowire,@Bean(name=”beanID” autowire=Autowire.byType/byName),byType表示自动注入相应类型的其它bean到当前bean需要注入的地方,byName表示自动注入同名的bean到当前bean需要注入的地方;

    (4)与此同时,在bean类中就无需加入任何注解了,而获取该bean的方法同之前一样(ApplicationContext …….);

    1. 注解与XML配置文件

    (1)   当两者都对bean配置时,XML配置文件优先;

    (2)   注解可以直接写在属性上,不需要get,set方法;

    (3)   XML配置文件为属性赋值时,必须得有get,set方法;

    ps.请另外查阅开发过程中需要使用的jar包

  • 相关阅读:
    ALV控件的简单案例之二:自定义ALV…
    上传文件时显示选择窗口
    RZ10设置ECC系统参数
    下载时,弹出下载地址选择窗口
    使用程序实现多client切换
    ALV控制某列的颜色
    WebService&nbsp;创建&nbsp;&nbsp;发布&nbsp;调用整个流…
    出口增强&nbsp;以EXIT_SAPLSZAR_001为例
    使用SAP&nbsp;memory&nbsp;调用标…
    FunctionModel调用ALV时,自定义工…
  • 原文地址:https://www.cnblogs.com/Drajun/p/8278833.html
Copyright © 2011-2022 走看看