从Spring 2.5 开始,自动装配功能进行了多次改进,可以通过@Autowired或者@Resource注解一个设值方法,构造字段,属性甚至任意方法自动装配特定的属性。
为了要求Spring 自动装配具有@Autowired或者@Resource注解的属性,必须在IOC容器中注册一个AutowiredAnnotationBeanPostProcessor实例。在上下文中什么实例:
写道
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
也可以在bean的配置文件中包含<context:annotation-config/>元素。或者是
写道
<context:component-scan base-package="*"></context:component-scan>
默认情况下所有带@Autowired的属性都是必须的,如果没有找到匹配的Bean就会抛出如下异常
写道
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sequenceGenerator': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private SpringInAction.IOC.PrefixGenerator SpringInAction.IOC.SequenceGeneratorImpl.prefixGenerator; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [SpringInAction.IOC.PrefixGenerator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at SpringInAction.IOC.App.main(App.java:14)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private SpringInAction.IOC.PrefixGenerator SpringInAction.IOC.SequenceGeneratorImpl.prefixGenerator; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [SpringInAction.IOC.PrefixGenerator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 13 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [SpringInAction.IOC.PrefixGenerator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:947)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:816)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:730)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:485)
... 15 more
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at SpringInAction.IOC.App.main(App.java:14)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private SpringInAction.IOC.PrefixGenerator SpringInAction.IOC.SequenceGeneratorImpl.prefixGenerator; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [SpringInAction.IOC.PrefixGenerator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 13 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [SpringInAction.IOC.PrefixGenerator] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:947)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:816)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:730)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:485)
... 15 more
如果你希望某个属性是可选的可以将@Autowired的required属性设置为false 。这样当Spring 找不到匹配的bean之后,将不设置该属性。
写道
@Autowired(required=false)
private PrefixGenerator prefixGenerator;
private PrefixGenerator prefixGenerator;
运行结果:
ABC10000A
ABC10001A
默认情况下,按照类型自动装配在IOC容器中有超过一个类型兼容性的Bean时无效,但是Spring 允许指定一个候选Bean 这个Bean的名称在@Qulifier注解中提供。
相关推荐
在 Spring 3.x 中,提供了两种用于属性装配的注解:@Autowired 和 @Resource。 1. @Autowired @Autowired 注解用于自动装配依赖项,默认按照类型匹配的方式(byType)进行注入。可以用于成员变量、setter 方法、...
- `@Component`、`@Service`、`@Repository`和`@Controller`:它们是Spring的组件注解,用于标记不同类型的bean,方便组件扫描和自动注册。 - `@Scope`:定义bean的作用域,如`@Scope("prototype")`表示多例,`@...
通过`@Component`、`@Service`、`@Repository`等注解,我们可以快速地将类声明为Spring管理的Bean,而`@Autowired`和`@Resource`则负责自动装配依赖。这种配置方式减少了XML配置文件的复杂性,提升了开发效率。
Spring使用注解来简化配置,如`@Autowired`用于自动装配依赖,`@Service`、`@Repository`和`@Controller`用于标记服务、数据访问层和控制器组件。 3. **Hibernate**:Hibernate是一个强大的ORM(对象关系映射)框架...
- 虽然这里没有提到,但整合后,Struts2 也可以利用 Spring 的注解(如 `@Autowired`, `@Qualifier`, `@Resource` 等)来进一步简化配置和实现依赖注入。 通过以上步骤,Struts2 框架与 Spring 框架可以无缝集成,...
自动装配Bean,Spring会根据类型匹配查找Bean实例并注入到需要的地方,极大地减少了XML配置的工作量。 ##### 1.2.4 @RequestMapping注解 用于映射HTTP请求到具体的处理方法上,可以指定请求路径、请求类型等参数。...
- **@Autowired**:自动装配bean,可以按类型或按名称匹配。 - **@Qualifier**:配合@Autowired指定注入的具体bean。 - **@Resource**:JSR-250标准注解,主要用于字段级别的注入,按名称匹配。 - **@Component**:...
- **@Autowired**:用于自动装配Bean,Spring会根据类型自动匹配。 - **@Qualifier**:当有多个相同类型的Bean时,可以用来指定具体的Bean。 - **@Resource**:基于JSR-250规范,用于资源查找,也可以用来替代@...
* 解释:@Autowired 注解用于自动装配 Bean,例如按类型装配、按名称装配等。 @Qualifier * 作用:用于指定按名称装配的 Bean。 * 解释:@Qualifier 注解用于指定按名称装配的 Bean,例如 @Autowired @Qualifier(...
例如,`@Autowired`用于自动装配bean,`@Qualifier`用于指定特定的bean,`@Resource`用于按名称注入,以及`@Inject`(JSR-330)和`@ManagedProperty`等。 ### 6. AOP(面向切面编程) Spring的另一个核心特性是AOP...
- **注入注解标记使用方法**:使用`@Autowired`、`@Resource`等注解来自动装配Bean。 - **AOP注解标记使用方法**:使用`@Aspect`、`@Before`等注解来定义和使用切面。 #### 八、Spring对数据访问技术的支持 - **...
4. 在Struts的Action中,通过@Autowired或@Resource注解注入由Spring管理的Service类。 5. Service类中通过SessionFactory获取Session,进行数据库操作。 6. 使用Spring的PlatformTransactionManager配置事务管理。 ...
- **@Autowired**:自动装配Bean,无需显式配置。 - **@Resource**:指定名称的Bean注入。 #### 5.2 支持EL表达式 - **Expression Language**:在配置文件中使用表达式语言来进行动态配置。 #### 5.3 支持AspectJ ...
Spring能够管理Struts2 Action和Hibernate DAO的生命周期,通过@Autowired或@Resource注解,可以自动装配依赖。此外,Spring的AOP功能可以用来实现事务管理,确保数据的一致性。 教程可能还会涵盖以下内容: 1. ...
其中,注解配置如`@Autowired`、`@Resource`等,使得依赖注入变得更加简洁和直观。Java配置则通过`@Configuration`和`@Bean`注解来定义bean的装配规则,提供了一种更为类型安全和可读性的配置方式。
这包括在STRUTS2的Action类中声明SPRING注解(@Autowired、@Resource等)或者使用SPRING提供的Action代理类。 4. **配置ACTIVITI5**:在应用中引入ACTIVITI5的jar包,并在SPRING配置文件中配置ACTIVITI的启动器和...
1. @Autowired注解:自动装配bean的依赖,使得配置更加简洁。 2. 面向资源(Resource):支持基于注解的资源管理,如文件、数据库连接等。 3. Spring MVC增强:增强了对RESTful服务的支持,以及模板引擎的集成。 4. ...
在SSH集成中,Spring管理Struts2的Action和Hibernate的SessionFactory,通过配置bean来实例化和装配这些对象。此外,Spring的AOP功能可以用于事务管理,确保数据操作的原子性和一致性。 4. **集成过程**:SSH的集成...
同时,@Autowired注解可以自动装配Bean的依赖,而@Qualifier则用于指定具体要注入的Bean。此外,Spring还提供了对bean命名策略的配置,如通过`@ComponentScan`注解中的`@BeanNameGenerator`属性来自定义Bean的名称...