原创文章,转载请标注出处:《Spring基础系列-JavaConfig配置》

原创作品,可以转载,但是请标注出处地址:

JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean
的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能

早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代码的灵活性,使得装配的过程也变得及其灵活。

  早以前,Spring推荐使用XML的方式来定义Bean及Bean之间的装配规则,但是在Spring3之后,Spring提出的强大的JavaConfig这种类型安全的Bean装配方式,它基于Java代码的灵活性,使得装配的过程也变得及其灵活。

普通的 POJO 只要标注了 @Configuration 注解,就可以为 Spring 容器提供
Bean 的定义信息。

使用JavaConfig来装配Bean拥有其自己的一套规则,我们在这里来看一看。

  使用JavaConfig来装配Bean拥有其自己的一套规则,我们在这里来看一看:

@Configurationpublic class SystemConfig { /** * 定义 Bean,并实例化 * * @return */ @Bean public UserDao userDao() { return new UserDao(); } @Bean public DeptDao deptDao() { return new DeptDao(); } /** * 定义 UserService,并把之前定义的 UserDao 与 DeptDao 注入进来 * * @return */ @Bean public UserService userService() { UserService service = new UserService(); service.setUserDao); service.setDeptDao); return service; }}
  • 规则一:@Configuration注解

1、规则

这个类的方法标注了 @Bean 注解,即为定义 Bean, Bean
的类型由方法返回值的类型决定,名称默认和方法名同名,也可以通过入参显示指定
Bean 名称,比如 @Bean(name=”xxx”)。 @Bean 所标注的方法体提供了 实例化
Bean 的逻辑 。

我们在定义JavaConfig类时,都会在其上加注@Configuration注解,来表明这是一个配置类,@Configuration注解底层是@Component注解,而且这个注解会被AnnotationConfigApplicationContext来进行加载,AnnotationConfigApplicationContext是ApplicationContext的一个具体实现,代表依据配置注解启动应用上下文。

规则一:@Configuration注解

以上配置和下面的 xml 是等效的:

  • 规则二:@ComponentScan注解

  我们在定义JavaConfig类时,都会在其上加注@Configuration注解,来表明这是一个配置类,@Configuration注解底层是@Component注解,而且这个注解会被AnnotationConfigApplicationContext来进行加载,AnnotationConfigApplicationContext是ApplicationContext的一个具体实现,代表依据配置注解启动应用上下文。

<bean /><bean /><bean p:userDao-ref="userDao" p:deptDao-ref="deptDao"/>

我们使用JavaConfig的目的是为了实现以前XML配置实现的功能,首先就是组件扫描功能,将我们使用特定注解标注的类统一扫描加载到Spring容器,这一功能就是依靠@ComponentScan注解来实现的,我们可以为其指定位置参数来指定要扫描的包。

规则二:@ComponentScan注解

基于 Java 类的配置方式和基于 XML 或者基于注解的配置方式相比——

  • 规则三:@Bean注解

  我们使用JavaConfig的目的是为了实现以前XML配置实现的功能,首先就是组件扫描功能,将我们使用特定注解标注的类统一扫描加载到Spring容器,这一功能就是依靠@ComponentScan注解来实现的,我们可以为其指定位置参数来指定要扫描的包。

  • Java 类的配置方式通过代码编程的方式,可以更加灵活地实例化 Bean
    和装配 Bean 之间的关系。
  • XML
    或者基于注解的方式都是通过声明来定义配置的,所以灵活性上要逊一些,但在配置上更简单

使用@Bean注解我们可以实现XML配置中手动配置第三方Bean的功能,这里我们使用方法来定义Bean,并在方法前面加注@Bean注针对第一种注入方式:解,表示要将该方法返回的对象加载到Spring容器中,这样就对我们的方法定义带来了一些限制,这些限制包括方法的大概格式:

规则三:@Bean注解

因为 @Configuration 注解类本身已经标注了
@Component,所以这些类可以像那些普通的 Bean 一样被注入到其他的 Bean 中。

  1. 方法带返回值,且返回类型为你要加载的第三方类类型
  2. 方法的名称为默认的Bean的name,如果要自定义Bean的name,可以使用@Bean注解的name属性。
  3. 要实现注入只需要将要注入的Bean的类型作为参数,调用该类的带参数的构造器构建这个Bean,或者采用第二种方式:先创建这个类的对象,然后调用该对象的set方法进行注入,以被注入的Bean的方法为参数

  使用@Bean注解我们可以实现XML配置中手动配置第三方Bean的功能,这里我们使用方法来定义Bean,并在方法前面加注@Bean注解,表示要将该方法返回的对象加载到Spring容器中,这样就对我们的方法定义带来了一些限制,这些限制包括方法的大概格式:

@Configurationpublic class ApplicationConfig { @Autowired private SystemConfig systemConfig; @Bean public AuthorityService authorityService() { AuthorityService service = new AuthorityService(); service.setUserDao(systemConfig.userDao; service.setDeptDao(systemConfig.deptDao; return service; }}

首先我们创建几个测试类

    1-方法带返回值,且返回类型为你要加载的第三方类类型

Spring 会对配置类中所有标注了 @Bean 的方法使用 AOP 增强,引入 Bean
的生命周期管理逻辑。比如上面的 systemConfig.userDao(),它返回的是对应
Bean 的单例。

3.1 针对第一种注入方式:

1-StudentService

@Servicepublic class StudentService { public void study(){ System.out.println("学生学习Java"); }}

2-TeacherService

@Servicepublic class TeacherService { private StudentService studentService; public TeacherService(StudentService studentService){ this.studentService=studentService; } public void teach(){ studentService.study(); }}

3-Config:这是针对第一种注入方式而设,需要在TeacherService
中定义带参数的构造器

@Configuration//@ComponentScanpublic class Config { @Bean(name="student") public StudentService studentService(){ return new StudentService(); } @Bean(name="teacher") public TeacherService teacherService(StudentService studentService){ return new TeacherService(studentService); } }

    2-方法的名称为默认的Bean的name,如果要自定义Bean的name,可以使用@Bean注解的name属性。

在 @Bean 中,我们还可以通过标注 @Scope 注解来控制 Bean 的作用范围:

发表评论

电子邮件地址不会被公开。 必填项已用*标注