Spring相关知识
来源:百度文库 编辑:神马文学网 时间:2024/05/28 06:23:12
Spring的各种变量注入配置文件代码(详见项目:spring_injection):
注入list类型的变量
注入set类型的变量
注入数组类型的变量
注入map类型的变量
如何定义属性编辑器?
(1).继承类PropertyEditorSupport,覆写方法setAsText();
(2).将属性编辑器注入到spring配置文件中。
如:如果有日期类型的属性需要注入的话,则需要写属性编辑器,继承PropertyEditorSupport类,覆写相应的方法—setAsText()
Spring公共属性注入描述方法(详见项目:spring_common):
(1).通过
(2).具有相同属性的类,只需在
公共属性注入配置文件中的代码:
---------------此处相当于java中父类
--------相当于子类继承了AbstractBean,拥有它的属性
(*)依赖对象的注入方法可以有:
(1).ref属性
(2).标签
(3).内部
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(指出切入点))。
配置文件中代码如下:
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;
}
}
相应配置文件中代码:
Spring配置中
1、在BeanFactory的配置中,
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相同的
5.name属性可以用’,’隔开指定多个名字,如
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) 下面就把事务应用到具体的类。看如下代码:
这里配置的作用是把我们上面创建的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 属性执行。
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;
}
}