Spring相关知识

来源:百度文库 编辑:神马文学网 时间:2024/05/28 06:23:12

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

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

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

       "listValue">

          

              list1

              list2

          

                                               注入list类型的变量

       "setValue">

          

              set1

              set2

              set3

          

                                               注入set类型的变量

       "arrayValue">

          

              array1

              array2

          

                                              注入数组类型的变量

       "mapValue">

          

              "k1"value="v1"/>

              "k2"value="v2"/>

          

                                          注入map类型的变量

如何定义属性编辑器?

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

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

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

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

    (1).通过标签定义公共属性,制定属性abstract = true;

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

 

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

"AbstractBean" abstract="true">

       "id"value="20044455"/>

       "name"value="Jack"/>

                   ---------------此处相当于java中父类

   

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

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

       "password"value="123456"/>

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

   

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

 

 

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

(1).ref属性

(2).标签

(3).内部来定义,此时无需标注id

 

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

作用域属性scope可以取值:

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

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

 

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

1、 引用相应的spring 架包

2、 采用Aspect定义切面

3、 在Aspect类中定义Pointcut和Advice

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

 

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

 

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

配置文件中代码如下:

       "securityAspect"ref="securityHandler">

           "allMethods"expression="execution(* com.bjsxt.spring.UserManagerImpl.add*(..))"/>

           "checkSecurity"pointcut-ref="allMethods"/>

      

 

 

Spring对AOP的支持(详见项目: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实例化时就得到设置,它保证了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;  

      }   

   }  

相应配置文件中代码:

  

        

     20   

    

  

Foo  

    

  

 

 

Spring配置中的id和name属性区别

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

 

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

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

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

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

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

   7.如果存在多个id和name都没有指定,且实例类都一样的,如:
代码




则第一个bean通过getBean("com.stamen.BeanLifeCycleImpl")获得,
第二个bean通过getBean("com.stamen.BeanLifeCycleImpl#1")获得,
第三个bean通过getBean("com.stamen.BeanLifeCycleImpl#2")获得,以此类推。

 

 

手工配置ssh事务管理器:

  
 
       
           
     
    

       这里创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,这个sessionFactory是指session工厂的ID。

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

 
       
           
           
           
     
 

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

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

 
      expression="execution(* test.service.impl.*.*(..))"/> 
       

       这里配置的作用是把我们上面创建的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 属性执行。      

           20

      

      

          Foo

      

 public classFoo {

        privateString name;

        privateint age;

        publicFoo(String name,int age){

          this.name = name;

          this.age = age;

        }

        publicString toStirng(){

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

        }

    }

 public classFoo {

        privateString name;

        publicvoid setName(String name) {

          this.name = name;

        }

        publicString toStirng(){

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

        }

      }