spring 企业开发3.0 4

来源:互联网 发布:人工智能电影在线看 编辑:程序博客网 时间:2024/05/17 22:12

 

 

bean的注入方式

    1,属性注入、构造函数注入、工厂方法注入

bean 的参数注入

字面值、引用其他的bean、内部bean、null值、级联属性、集合属性、

 

用p空间的来简化bean的配置方式

自动装配autowire  (byname,bytype,constructor,)

 

方法的注入

无状态的bean的作用域一般为单列,如果在boss单列中注入prototype bean car,并希望每次调用时返回一个新的car,使用传统注入方式不能实现。如果想得到新的car,一种可选的方法就是让boss实现beanfactoryAware 接口,让boss能够访问容器的引用。这样boss的获取car的方法可以采用下面的方式  foctory。getbean(“car'”);但是这种方式绑定了框架。

 

lookup方法注入<bean id='magicclass' class='com.baoabotao.injectfun.MagicBoss'>  <lookup-method name='gecar' bean='car'/> ,实现方式其实就是在srping动态运行期间为MagicBoas接口提供动态实现。

方法替换

    public  class Boss2 implements MethodReplacer{

        public object reimplement(Object arg0,Method args1,Object[] args2){

                   CAR car = new    Car();

      }

 }

 

<bean id="boss1" calss="com.baobaotao.injectfun.Boss1"> <replaced-method name="getcar" replacer="boss2">

 

<bean> 之间的关系

不但可以通过<ref> 引用另一个bean,建立bean与bean的依赖关系,相似的,<bean>元素标签之间可以建立类似的关系。继承、依赖、引用

 

bean的作用域

singleton作用域  ,传统开发下,dao类执有connection这个非线程安全的变量往往没有采用单列模式,在spirngI型啊,对于所有dao类都可以采用单列模式。因为

利用spirng 的 aop和localthread的功能。

 

web应用环境相关的bean作用域

request,session globalsesion, 使用前,首先必须在web容器中进行一些额外的配置。

   在低版本的web容器(serlvet2.3之前),用户可以使用http请求过滤器进行配置

<web-app>

<filter>

 < filter-name>requestContextFilter</fitler-name>

<filter-class>org.springframwork,web.filter,requestContextFilter</filter-class>

</filter>

<filter-mapping>

  <filter-name>requestContextFilter</filter-name>

<url-pattern>/*</url-parrtern>

<filter-mapping>

<web-app> 

在高版本web中,则可以使用http请求监听进行配置

<web-app>

<listener><listener-class>org.springframwork,web.context.requet.requestContextListnner</listener>.....

细心的朋友可能问,在第3张中webappliactionContext初始化时,我们已经通过Contextloaderlistner (或ContextLoaderserlvet)将web容器与spring 容器整合,为什么在这里又要引入一个额外RequestContextList ener以支持bean的另外3哥作用域呢。通过分析两个监听器的源码,可以知道,serlvetContextListener只负责监听web 容器启动和关闭事件,而requestContextListener 监听http请求事件。

<bean name="car" class="com.baobaotao.scope.car" scope="request"><aop:scoped-proxy></bean>

<bean id="boss" class="com.baobao.tao.scope.boss"><property name="car" ref="car">我们

很容易知道配置文件中添加<aop :scoped-proxy>后,注入到boss bean中的car bean 已经不是原来的car ,而是car bean 的动态代理对象了。这个动态代理对象时car类的之类或car 的接口,spring在动态代理子类中加入了一段逻辑判断当前的boss需求取得哪个http请求相关的car bean 。 (动态代理所添加的逻辑其实也很简单),即判断当前boss位于哪个线程中。然后根据这个线程找到对应的httprequest,再从httprequest域中获取对应的car。因为web容器特性,一个http请求一般情况下对应一个独立线程。

 

factorybean

 

注意,要细心理解。一般情况下,spring通过反射机制利用<bean>的class属性指定实现实例化bean。在某些情况下, 实例化bean 的过程比较复杂,如果按照传统的方式,则要<bean>中提供大量的配置信息,配置方式的灵活性是受限制的,这时采用编码的方式可能会得到一个简单的方案。spring提供一个org.spirngframework.beans.factory.factorybean 工厂类接口,用户可以通过实现工厂接口定制实例化bean的逻辑。

从spring3.0开始,factorybean开始支持泛型,接口声明为Factorybean<T>  .方法  T getObject 注意 是getobject而不是getbean(). 当配置文件中<bean>的class配置属性的实现类是factorybean时,通过getbean()方法返回的不是factorybean本身,而是 fatorybean.getObject()方法所返回的对象。相当于factorybean.getObejct()代理了getbean().

 

<bean id="car1" class="com.baobaotao.fb.carfactorybean p:carinfo="红旗CA72,200,20000.00"/>

如果用户希望得到carfactorybean自身,则需求在使用getbean(‘beanname’)方法时显示地在beanname前加上 "&" 前缀。getbean(“&car”)。

 

基于注解的配置。

  spring 容器成功启动三大要件:bean的定义信息、bean的实现类、以及spirng自己。如果基于xml配置,bean定义信息和bean实现类本身是分离的。而采用基于注解的配置方式时,bean定义信息即通过在bean实现类上标注注解实现。

@Compoment 

@Repository 对应dao实现类进行标注的

@service对应service实现类进行标注

@controller用于对controller实现类进行标注

 

使用注解配置信息启动spring容器

 通过声明context命名空间。通过 context命名空间的component-scan的base-package属性指定一个需要扫描的基类包。如果仅希望扫描特定的类而非基包下的所有类。则可以使用resource-pattern属性过滤特定的类。

<context:componemnt-scan base-package="com.baobaotao" resource-pattern='anno/*.class'>

<context:compoment-scan base-package="com.baobaotao">

  <context:include-filter type="regex" expression="com\.baobaotao\.anno.*">

<context:exclude-filter type"aspectj" expression="com.baobaotao..*cotroller+">

 

 自动装配bean

@Autowinre进行自动注入。

@autowire的required属性,如果容器中没有一个和标注变量类似匹配的bean、容器启动时将报错。

@autowire @Qualifier

 

 

bean的注入 包括 定义id 、自动注入bean 、注入方法、注入参数、 注入生命周期方法,注入作用域

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击