Spring 使用注解完成bean实例化、依赖注入的相关配置以及注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pencil_x/article/details/79977922

一、 相关配置实例化注解介绍
首先使用注解完成spring容器实例的配置,主要用到以下几个:
1、@Repository(“name”):配置持久层实例bean,通常用在DAO; 这里配置的name属性相当于在
2、@Service(“”):业务层bean实例化,也即Service层相关类
3、@Controller(“”) :控制层bean实例,如:struts中的action
4、@Scope(“”):指定bean实例化的模式,常用属性,单例(singleton),多例(prototype);另外,还有session,request
5、@Component(“”):用于人任意类的实例化配置,不如上边几种有那么强的语义。
2. 依赖注入相关注解
1、@Autowired:为依赖属性实现注入依赖实例,但是存在以一种情况使用该标签会出错——当一个容器中,存在多个同类型单例模式的bean实例,autowrired会因无法确定应该注入哪个实例而报错类似于:expected single matching bean but found 3 。

下面举个简单的例子:

下面代码为两个有依赖关系且要实例化的bean

@Controller("customerAction")
public class CustomerAction extends ActionSupport {
    @Autowired    //指定属性依赖注入对象
    //@Qualifier("customerService1")
    private CustomerService customerService; 

    //.......
}
/////////////////////////////////////////////////////
@Service
public class CustomerServiceImpl implements CustomerService {
//........
}

此时,在spring中人为的配置了如下bean实例

<bean id="customerService1" class="cn.ppppp.crm.service.impl.CustomerServiceImpl"> <!-- 这里配置为单例 -->
    </bean>
    <bean id="customerService2" class="cn.ppppp.crm.service.impl.CustomerServiceImpl"> <!-- 这里配置为单例 -->
    </bean>

2、@Qualifier(“customerService1”):配合Autowired使用,如Action中被注释语句,解决上述问题,属性指定需要用哪个实例来注入依赖属性。附,另一种解决方法:以上面例子,当指定@Service(“customerService”)的name属性时也不会出现以上错误。我的理解是,框架在加载的时候在没有指定实例化bean对象,首先加载由注解完成的实例。
二、使用的注解完成bean实例化的环境配置(注:STS IDE)
1、添加jar包:spring-aop-4.2.4.RELEASE.jar

2、Spring容器applicationContext.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

同时在做以下配置window>preferences>xml catalog>
这里写图片描述
location:为本地xsd文件路径
容器扫描组件,完成对注解的加载

<!-- 
        扫描@Reposotory,@Service,@Controler,@Scope注解
        base-package: 指定扫描范围,即base-package目录下子包,或文件
     -->
    <context:component-scan base-package="cn.pppp.crm"></context:component-scan>
    <!-- 对依赖属性注入使用注解 -->
    <context:annotation-config></context:annotation-config>
阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页