分享

Spring相关知识

 昵称3403205 2010-09-17

Spring的各种变量注入配置文件代码(详见项目:spring_injection)

<property name="strValue" value = "hello"/>    注入string类型的变量

       <property name="intValue" value = "123"/>    注入int类型的变量

       <property name="listValue">

           <list>

              <value>list1</value>

              <value>list2</value>

           </list>

       </property>                                        注入list类型的变量

       <property name="setValue">

           <set>

              <value>set1</value>

              <value>set2</value>

              <value>set3</value>

           </set>

       </property>                                        注入set类型的变量

       <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>                                   注入map类型的变量

如何定义属性编辑器?

(1).继承类PropertyEditorSupport,覆写方法setAsText()

(2).将属性编辑器注入到spring配置文件中。

如:如果有日期类型的属性需要注入的话,则需要写属性编辑器,继承PropertyEditorSupport类,覆写相应的方法—setAsText()

Spring公共属性注入描述方法(详见项目:spring_common)

    1.通过<bean>标签定义公共属性,制定属性abstract = true

    2.具有相同属性的类,只需在<bean>标签中指定其parent属性即可

 

公共属性注入配置文件中的代码:

<bean id = "AbstractBean" abstract="true">

       <property name="id" value="20044455"/>

       <property name="name" value="Jack"/>

    </bean>               ---------------此处相当于java中父类

   

    <bean id = "bean2" class = "com.bjsxt.spring.Bean2" parent="AbstractBean">

<property name="name" value="Jack"/>   -------相当于函数覆写了一样

       <property name="password" value="123456"/>

    </bean>      --------相当于子类继承了AbstractBean,拥有它的属性

   

    <bean id = "bean3" class = "com.bjsxt.spring.Bean3" parent="AbstractBean"/>

 

 

*)依赖对象的注入方法可以有:

1.ref属性

2.<ref>标签

3.内部<bean>来定义,此时无需标注id

 

Spring Bean的作用域(详见项目:spring_self_injection)

作用域属性scope可以取值:

   i.singleton-----表示每次调用getBean时,返回相同的实例;(系统默认情况下是singleton的)

   ii.prototype-----表示每次调用getBean时,返回不同的实例;

 

Spring AOP知识(①采用annotation方式)

1、  引用相应的spring 架包

2、  采用Aspect定义切面

3、  Aspect类中定义PointcutAdvice

4、  启用Aspectannotation的支持,并且将Aspect类和目标对象配置到Ioc容器中。

 

注意:这种方式定义中,切入点的方法是不被执行的,仅起到标识作用(即Advice通过该方法名找到相应切入点)

 

Spring AOP知识(②采用配置文件方式)(详见项目:spring_aop2):在配置文件中写入相应的aspect切面(给出具体的所引对象)、Pointcut(切入点)(给定他的id(用于标识,便于advice找到在哪个切入点)和表达式(操作于哪些方法))和advice(具体的放法)(必须指定它的method(即自己添加的方法,与业务无关)和Pointcut-ref(指出切入点))。

配置文件中代码如下:

<aop:config>

       <aop:aspect id = "securityAspect" ref="securityHandler">

           <aop:pointcut id="allMethods" expression="execution(* com.bjsxt.spring.UserManagerImpl.add*(..))"/>

           <aop:after method="checkSecurity" pointcut-ref="allMethods"/>

       </aop:aspect>

</aop:config>

 

 

SpringAOP的支持(详见项目:spring_aop2):

Aspect在默认情况下不用实现接口,但目标对象必须实现接口,如果没有实现接口,则必须引入CGLIB

我们可以通过在advice的具体方法中添加JoinPoint参数,这个值可以由spring自动传入,从JoinPoint中可以获得参数值和方法名等等。(详见项目:spring_aop3)

 

 

 

spring注入setXxx()方法或构造函数法)

属性注入即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式有可选择性和灵活性高的优点,因此属性注入是实际应用中最常用的注入方式。

代码如下:

public class Foo {   

  private String name;   

  public void setName(String name) {   

 this.name = name;   

}      

 public String toStirng(){   

return "Foo Name is :" + this.name;   

    }   

 }  

相应配置文件中代码如下:

<bean id="foo" class="com.tony.test.Foo">   

  <property name="name" value="Foo"/>   

  </bean>

构造函数注入

构造函数注入是除属性注入之外的另一种常用注入方式,它保证一些必要的属性在Bean实例化时就得到设置,它保证了Bean实例在实例化后就可以使用

代码:

public class Foo {   

  private String name;   

 private int age;   

public Foo(String name,int age){   

  this.name = name;   

this.age = age;   

  }   

  public String toStirng(){   

return "Foo Name is :" + this.name;   

      }   

   }  

相应配置文件中代码:

<bean id="foo" class="com.tony.test.Foo">   

      <constructor-arg type="int">   

     <value>20</value>   

 </constructor-arg>   

<constructor-arg type="java.lang.String">   

<value>Foo</value>   

 </constructor-arg>   

</bean>  

 

 

Spring配置中<bean>idname属性区别

1、在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即idname1.id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字、符号打头,不能有空格,如123?ad,"ab "等都是不规范的,Spring在初始化时就会报错,诸如:代码
org.xml.sax.SAXParseException: Attribute value "?ab" of type ID must be a name.

 

    2.name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报出诸如以下的错误:代码
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'a b' is defined

3.配置文件中不允许出现两个id相同的<bean>,否则在初始化时即会报错,如:
代码
org.xml.sax.SAXParseException: Attribute value "aa" of type ID must be unique within the document.

   4.
但配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那 <bean>被后面同名的 <bean>覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。

   5.name
属性可以用’,’隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)

   6.
如果idname都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")
返回该实例。

   7.
如果存在多个idname都没有指定,且实例类都一样的<bean>,如:
代码
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>

则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,
第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,
第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。<bean id="foo" class="com.tony.test.Foo">

 

 

手工配置ssh事务管理器:

 <!-- 配置事务管理器 --> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 
      <property name="sessionFactory">
 
          <ref bean="sessionFactory"/>
 
      </property>   
 
</bean>

       这里创建了一个idtransactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID

3)        对事务管理器进行事务设置。增加如下代码:

<tx:advice id="smAdvice" transaction-manager="transactionManager"> 
      <tx:attributes>
 
          <tx:method name="save*" propagation="REQUIRED"/>
 
          <tx:method name="del*" propagation="REQUIRED"/>
 
          <tx:method name="update*" propagation="REQUIRED"/>
 
      </tx:attributes>
 
</tx:advice>

       这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以savedelupdate开头的方法应用事务。

4)        下面就把事务应用到具体的类。看如下代码:

<aop:config> 
      <aop:pointcut id="smMethod"
 
expression="execution(* test.service.impl.*.*(..))"/>
 
      <aop:advisor pointcut-ref="smMethod" advice-ref="smAdvice"/>
 
</aop:config>

       这里配置的作用是把我们上面创建的advice应用到具体的类中。以上代码的意思指,给test.service.impl下的所有类的所有方法应用smAdvice

5)        示例:使用Session

 

 

 

几种事物的传播特性

1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启。
2. PROPAGATION_SUPPORTS:
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。
3. PROPAGATION_MANDATORY:
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW:
总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED:
总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER:
总是非事务地执行,如果存在一个活动事务,则抛出异常。
7. PROPAGATION_NESTED
:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。       <constructor-arg type="int">

           <value>20</value>

       </constructor-arg>

       <constructor-arg type="java.lang.String">

           <value>Foo</value>

       </constructor-arg>

</bean>

 public class Foo {

        private String name;

        private int age;

        public Foo(String name,int age){

           this.name = name;

           this.age = age;

        }

        public String toStirng(){

           return "Foo Name is :" + this.name;

        }

    }

 public class Foo {

        private String name;

        public void setName(String name) {

           this.name = name;

        }

        public String toStirng(){

           return "Foo Name is :" + this.name;

        }

      }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多