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类中定义Pointcut和Advice
4、 启用Aspect对annotation的支持,并且将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>
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 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>的id和name属性区别
1、在BeanFactory的配置中,<bean>是我们最常见的配置项,它有两个最常见的属性,即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相同的<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.如果id和name都没有指定,则用类全名作为name,如<beanclass="com.stamen.BeanLifeCycleImpl">,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
7.如果存在多个id和name都没有指定,且实例类都一样的<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")获得,以此类推。
手工配置ssh事务管理器:
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<refbean="sessionFactory"/>
</property>
</bean>
这里创建了一个id为transactionManager的事务管理器,它匹配一个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(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。
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 属性执行。
联系客服