Spring 允许提取公用的Bean配置成一个父bean. 从父Bean继承而来的Bean称为子Bean。 子Bean 从父bean继承Bean的配置,包括bean的属性和<bean>元素中的属性,避免了重复配置。 子bean在必要时也可以覆盖继承的配置。父bean可以作为一个配置模板也可以作为一个Bean的实例。 但是,如果希望父bean仅仅作为一个配置模板而不能检索,必须将abstract设置成true,要求Spring不要实例化这个bean。
必须注意的是不是所有在父<bean>元素中定义的属性都会被继承。例如:autowired和dependency-check属性不会从父bean中继承。
有这样一个类:
写道
public class SequenceGeneratorImpl implements SequenceGenerator {
/** 前缀 ***/
private List<String> prefixes;
@Autowired
@Qualifier("dataPrefixGenerator")
private PrefixGenerator prefixGenerator;
/** 后缀 **/
private String suffix;
/** 初始值 **/
private int initial;
/** 计数器 ***/
private int counter;
public SequenceGeneratorImpl() {
}
public String getSequence() {
StringBuffer sb = new StringBuffer();
if (null != prefixGenerator) {
sb.append(prefixGenerator.getPrefix());
}
for (String s : prefixes) {
sb.append(s);
}
sb.append(initial + counter++);
sb.append(suffix);
return sb.toString();
}
public List<String> getPrefixes() {
return prefixes;
}
public void setPrefixes(List<String> prefixes) {
this.prefixes = prefixes;
}
public String getSuffix() {
return suffix;
}
@Required
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public int getInitial() {
return initial;
}
public void setInitial(int initial) {
this.initial = initial;
}
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
/** 前缀 ***/
private List<String> prefixes;
@Autowired
@Qualifier("dataPrefixGenerator")
private PrefixGenerator prefixGenerator;
/** 后缀 **/
private String suffix;
/** 初始值 **/
private int initial;
/** 计数器 ***/
private int counter;
public SequenceGeneratorImpl() {
}
public String getSequence() {
StringBuffer sb = new StringBuffer();
if (null != prefixGenerator) {
sb.append(prefixGenerator.getPrefix());
}
for (String s : prefixes) {
sb.append(s);
}
sb.append(initial + counter++);
sb.append(suffix);
return sb.toString();
}
public List<String> getPrefixes() {
return prefixes;
}
public void setPrefixes(List<String> prefixes) {
this.prefixes = prefixes;
}
public String getSuffix() {
return suffix;
}
@Required
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public int getInitial() {
return initial;
}
public void setInitial(int initial) {
this.initial = initial;
}
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
配置文件如下:
写道
<bean id="baseSequenceGenerator" abstract="true"
class="SpringInAction.IOC.SequenceGeneratorImpl" p:initial="10000"
p:suffix="F">
<property name="prefixes">
<list>
<value>A</value>
</list>
</property>
</bean>
<bean id="sequenceGenerator" parent="baseSequenceGenerator" />
<bean id="secondSequenceGenerator" parent="baseSequenceGenerator"
p:suffix="C" />
class="SpringInAction.IOC.SequenceGeneratorImpl" p:initial="10000"
p:suffix="F">
<property name="prefixes">
<list>
<value>A</value>
</list>
</property>
</bean>
<bean id="sequenceGenerator" parent="baseSequenceGenerator" />
<bean id="secondSequenceGenerator" parent="baseSequenceGenerator"
p:suffix="C" />
测试方法:
写道
package SpringInAction.IOC;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:beans.xml")
public class SequenceGeneratorTest {
@Autowired
private SequenceGenerator sequenceGenerator;
@Autowired
private SequenceGenerator secondSequenceGenerator;
@Test
public void testSequence() {
String s = sequenceGenerator.getSequence();
System.out.printf("FirstSequence:%s %n",s);
Assert.assertTrue(s != null);
}
@Test
public void testSecondSequence() {
String s = secondSequenceGenerator.getSequence();
System.out.printf("secondSequence:%s %n",s);
Assert.assertTrue(s != null);
}
}
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:beans.xml")
public class SequenceGeneratorTest {
@Autowired
private SequenceGenerator sequenceGenerator;
@Autowired
private SequenceGenerator secondSequenceGenerator;
@Test
public void testSequence() {
String s = sequenceGenerator.getSequence();
System.out.printf("FirstSequence:%s %n",s);
Assert.assertTrue(s != null);
}
@Test
public void testSecondSequence() {
String s = secondSequenceGenerator.getSequence();
System.out.printf("secondSequence:%s %n",s);
Assert.assertTrue(s != null);
}
}
测试结果:
写道
secondSequence:20140129A10000C
FirstSequence:20140129A10000F
FirstSequence:20140129A10000F
工程见附件
相关推荐
这种方法需要在 Spring 配置文件中添加一个 Bean,例如 `<bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />`。然后,我们可以实现 BeanFactoryAware 接口,使用 ...
<bean id="springUtil" class="org.coderecord.ccms.web.action.util.SpringUtil" /> ``` 使用这个工具类,我们可以在程序的任何地方获取Bean,例如: ```java YourClass obj = (YourClass) SpringUtil.getObject...
### Spring Boot in Action – Chapter 2 Sample:开发第一个Spring Boot应用 #### 一、章节概述 本章主要介绍如何利用Spring Boot快速启动一个项目,并通过实际案例深入理解Spring Boot自动配置的功能及其工作...
4. 创建SpringAction 创建一个继承自Spring的ActionSupport类的Action,这样Struts会从Spring容器中查找并注入对应的Bean。例如: ```java public class MyAction extends SpringActionSupport { private ...
为了实现Spring对Struts Action的管理,我们需要在Web应用中配置Spring容器,并通过Spring来创建和管理Struts中的Action实例。这样做的好处在于,Action实例的生命周期和依赖关系都可以由Spring容器来管理,提高了...
2. **Struts2配置**:启用Spring插件,配置Action类为Spring管理的bean。 3. **Hibernate配置**:配置数据库连接信息,定义实体类映射,开启自动扫描实体类。 4. **Action类**:通常标记为`@Component`,并使用`@...
- 创建Spring配置文件(如`applicationContext.xml`),配置Bean定义,包括Service层、DAO层以及Action类等的实例化和依赖注入。 - 使用Spring的AOP功能,实现事务管理。例如,可以定义一个事务切面,对需要进行...
- `@ParentPackage` 用于指定当前 Action 继承的 Struts2 包,通常用来继承配置好的拦截器栈。例如,`@ParentPackage("struts-default")` 将使用默认的 Struts2 拦截器配置。 3. **Namespace 注解** - `@...
2. **配置Spring**: 在Spring的配置文件中声明Action类,通过`<bean>`标签定义,并设置其属性以注入依赖。 3. **配置Struts**: 在struts.xml中配置Action,但不再定义Action类,而是引用Spring中定义的bean。 4. *...
- **配置Bean**:在`applicationContext.xml`中定义Action类的Bean,以便Spring管理,如`<bean id="loginAction" class="com.test.action.LoginAction"/>`。 - **整合Struts2**:在`struts.xml`中,通过`...
通过在struts-config.xml和action-servlet.xml之间建立的桥梁,即action-mapping,可以实现Struts Action与Spring Bean之间的映射。 #### 方案二:继承Spring的ActionSupport类 另一种整合方式是通过继承Spring的...
这需要在`struts-config.xml`中配置`ContextLoaderPlugIn`插件,指定`contextConfigLocation`属性为Spring的配置文件路径,如`WEB-INF/applicationContext.xml`,这样Struts Action就能访问到Spring上下文中的Bean。...
1. **beans.xml**:这是Spring的配置文件,定义了Bean的实例化、依赖关系等。例如: ```xml <bean id="userService" class="com.example.UserService"> </bean> ``` 这里定义了一个UserService Bean,并注入...
3. **使用DelegatingActionProxy代理Action**:在`struts-config.xml`中,所有Action的type属性改为`DelegatingActionProxy`,而非具体类名,然后在Spring配置文件中定义对应的bean。这是最灵活的整合方式,因为它...
- **Spring管理Hibernate SessionFactory**:在Spring配置文件中,使用SessionFactoryBean配置SessionFactory,并配置事务管理器。 - **Struts2与Spring整合**:配置Struts2-Spring插件,使Action可以通过Spring管理...
在SpringInAction的示例代码中,你可以看到如何自定义这些配置来适应你的应用需求。理解这些加载顺序和配置方式对于调试和优化Spring应用的性能至关重要,因为它们直接影响到Spring容器的初始化以及请求的处理流程。