打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring相关知识

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 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相同的<bean>,否则在初始化时即会报错,如:
代码
org.xml.sax.SAXParseException: Attribute value "aa" of type ID mustbe unique within the document.

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

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

   6.
如果idname都没有指定,则用类全名作为name,如<beanclass="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">
 
          <refbean="sessionFactory"/>
 
      </property>   
 
</bean>

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

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

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

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

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

<aop:config> 
      <aop:pointcut id="smMethod"
 
expression="execution(* test.service.impl.*.*(..))"/>
 
      <aop:advisorpointcut-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-argtype="int">

           <value>20</value>

      </constructor-arg>

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

          <value>Foo</value>

      </constructor-arg>

</bean>

 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;

        }

      }

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java的Spring框架中AOP项目的一般配置和部署教程
mybatis中文版教程
足够应付面试的Spring事务源码阅读梳理
Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解实例详解(二)
5.Spring的事务管理
深入理解微服务架构spring的各个知识点(面试必问知识点)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服