Spring框架Bean配置注解方案实例(实用)

with 0 comment

Spring框架采用注解方案进行Bean配置是目前比较主流的方案,该方案配置文件简洁,类关系主需要在类中注解即可,且不需要重复的get/set方法,实用性高!

Spring4.jpg

关键配置文件

无论使用那种方式配置Bean都需要配置Spring的配置文件。
在web.xml指向自定义的配置文件名:mebugs.service.xml
ContextLoaderListener是Spring的监听器,它的作用就是启动Web容器时,自动装配ApplicationContext的配置信息
因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!-- classpath是指 WEB-INF文件夹下的classes目录 -->
    <!-- classpath 和 classpath* 区别 -->
    <!-- classpath:只会到你的class路径中查找找文件 -->
    <!-- classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找 -->
    <!-- <param-value>classpath:mebugs.service.xml </param-value> -->
    <!-- 可以加载多个文件 -->
    <param-value>
        /WEB-INF/classes/mebugs.service.xml
    </param-value>
</context-param>

配置自动扫描

使用注解配置方案不再需要将Bean全部配置在xml文件中,但需要指定一个扫描目录。
因为配置的注解内容是写在实际的类文件中,所以需要让Spring能够扫描到。
所以需要使用注解的类一定需要包含在扫描路劲下。

<!-- resource-pattern过滤,默认"**/*.class",即基类包里的所有类 -->
<!-- 如下设置为基包里uesr子包中的类 -->
<context:component-scan base-package="com.mebugs" resource-pattern="uesr/*.class"/ >

加入注解实例

为了更加方便理解注解,我们直接用一个类实例来说明,并对常见注解的作用进行说明。

package com.mebugs;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * 米虫用户类业务层层
 * @author mebugs
 *
 */

//此外Spring提供了3个功能基本和@Component等效的注解

//分别用于对DAO、Service及Web层的Controller进行注解

//比如此处可以使用@Service

//@Repository:用于对DAO实现类进行标注

//@Service:用于对Service实现类进行标注

//@Controller:用于对Controller实现类进行标注

//使用@Component注解 与XML配置等效:
//<bean id="userServ" class="com.mebugs.UserService"/>
@Component("userServ")

//@Scope指定 singleton单例 prototype原型,多例
@Scope("prototype")

public class UserService 
{
    //@Autowired的required属性默认true
    //要求一定要找到匹配的Bean,否则将报异常
    //等效于XML配置中的property配置
    @Autowired(required=false)
    //选用注解
    //容器中有一个以上匹配的Bean时,则可以通过@Qualifier注解限定Bean的名称
    @Qualifier("user")
    private User user;
    
    //常见的写法
    //自动寻找这个userDao,属性的命名替代了bean的名字
    @Autowired
    private UserDao userDao;
    
    //Spring允许对方法入参标注@Qualifier以指定注入Bean的名称
    @Autowired
    public void init(@Qualifier("user")User user)
    {
        System.out.println("now init");
    }
    
    //标准注入注解
    //@Resource要求提供一个Bean名称的属性,如果属性为空,则自动采用标注处的变量名或方法名作为Bean的名称
    @Resource("user")
    private void setMan(User user)
    {
        this.user = user;
    }
    
    //初始方法注解
    @PostConstruct
    private void init1()
    {
         System.out.println("now init");
    }
    
    //销毁方法注解
    @PreDestroy
    private void destory(){
         System.out.println("now over");
    }

}
Responses