通过注解(annotation)配置Bean

Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning).

特定组件的注解包括:

    @Component:基本注解,标识了一个受spring管理的组件.

      @Repository:标识持久层组件

    @Service:标识服务层(业务层)组件

    @Controller:标识表现层组件

对于扫描上的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值表示组件的名称.

  当在组件上使用了特定的注解之后,还需要在spring的配置文件中声明:

 <context:component-scan base-package="com.wang" resource-pattern="dao/*.class"></context:component-scan>

  其中bese-package是必须的属性,resource-pattern是可选的属性

    bese-package:制定一个需要扫描的基类包Spring容器将会扫描这个基类包及其子类包中的所有类.当需要扫描多个包时,可以使用逗号隔开.

    resource-pattern:如果仅希望扫描特定的类,而非基包下的所有类,可以使用这个属性过滤特定的类.如上即表示只扫描com.wang的子包dao中的所有类.

组件装配:

  <context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@autowired,@Resource,@Inject注解的属性.

使用@Autowired自动装配bean:

  @Autowired注解自动装配具有兼容类型的单个Bean属性:

    构造器,普通字段,一切具有参数的方法上都可以使用@autowired

    默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常,如果某一属性允许不被设置,可以设置@Autowired注解的required=false

    默认情况下,当IOC容器中存在多个类型兼容的bean时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称.

    @Autowired注解也可以应用在数组类型,集合属性,Map类型上.

下面通过一个例子,来应用一下上面的知识点,包结构和类如下,是一个简单的mvc结构对User实现增删改查的例子:

User类:

//主要演示注解,这里不再定义属性
public class User {

}

UserDao接口:

public interface UserDao {

    public void add();
    public void delete();
    public void update();
    public void search();
}

UserDaoImpl类:

@Repository
public class UserDaoImpl implements UserDao {

    @Override
    public void add() {
        System.out.println("添加用户");
    }
    @Override
    public void delete() {
        System.out.println("删除用户");
    }
    @Override
    public void update() {
        System.out.println("更新用户");
    }
    @Override
    public void search() {

        System.out.println("查询用户");
    }

}

UserService类:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public void add() {
        userDao.add();
        System.out.println("service add..");

    }
    public void delete() {
        userDao.delete();
        System.out.println("service delete..");

    }
    public void update() {
        userDao.update();
        System.out.println("service update..");

    }
    public void search() {
        userDao.search();
        System.out.println("service search..");

    }
}

UserAction类:

@Controller
public class UserAction {

    @Autowired
    private UserService userService;

    @Autowired(required=false)
    private User user;
    public String add(){

        userService.add();
        System.out.println("UserAction add..");
        System.out.println(user);
        return null;
    }
    public String delete(){

        userService.delete();
        System.out.println("UserAction delete..");
        return null;
    }
    public String update(){

        userService.update();
        System.out.println("UserAction update..");
        return null;
    }
    public String search(){

        userService.search();
        System.out.println("UserAction search..");
        return null;
    }

}

配置文件beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        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-4.2.xsd">
       <context:component-scan base-package="com.wang" />

</beans>

测试代码:

public class Test1 {

    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");

    UserAction userAction=(UserAction) ctx.getBean("userAction");
    userAction.add();

    }
}

打印结果:

添加用户
service add..
UserAction add..
null

因为在User类中,我们没有添加任何注解信息,而在UserAction类中定义属性user时,又在@Autowired中添加了required="false",所有打印出来的user为null.

时间: 2024-10-08 12:02:44

通过注解(annotation)配置Bean的相关文章

spring笔记--通过注解(annotation)配置Bean

Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基本注解,标识了一个受spring管理的组件.   @Repository:标识持久层组件 @Service:标识服务层(业务层)组件 @Controller:标识表现层组件 对于扫描上的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值表示组件的名

Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

Bean 注解(Annotation)配置(1)- 通过注解加载Bean

Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Control – IOC) 理解依赖注入(DI – Dependency Injection) Bean XML 配置(1)- 通过XML配置加载Bean Bean XML 配置(2)- Bean作用域与生命周期回调方法配置 Bean XML 配置(3)- 依赖注入配置 Bean XML 配置(

Spring--通过注解来配置bean【转】

Spring通过注解配置bean 基于注解配置bean 基于注解来配置bean的属性 在classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定的组件包括: [email protected]:基本注解,标识了一个受Spring管理的组件 [email protected]:标识持久层组件 [email protected]:标识服务层(业务层)组件 [email protected]:

Spring--通过注解来配置bean

Spring通过注解配置bean 基于注解配置bean 基于注解来配置bean的属性 在classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定的组件包括: [email protected]:基本注解,标识了一个受Spring管理的组件 [email protected]:标识持久层组件 [email protected]:标识服务层(业务层)组件 [email protected]:

spring 注解方式配置Bean

概要: 再classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定组件包括: @Component:基本注解,标示了一个受Spring管理的组件(可以混用,spring还无法识别具体是哪一层) @Respository:建议标识持久层组件(可以混用,spring还无法识别具体是哪一层) @Service:建议标识服务层(业务层)组件(可以混用,spring还无法识别具体是哪一层) @Con

跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Respository:标识持久层组件 3.@Service:标识业务层组件 4.@Controller:标识表现层组件 Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件

【Spring】IOC之基于注解的配置bean

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.基于注解的配置 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这3 个注

【Spring】IOC之基于注解的配置bean(下)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.@Autowired注解 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 Aut