4、Spring IOC的JavaConfig类的使用

371 阅读2分钟

1、概述

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

2、基于java的容器配置

2.1、基本概念@Bean和@Configuration

2.3.1、绑定Java和XML配置

package com.zhl;

import com.alibaba.druid.pool.DruidDataSource;
import com.zhl.entity.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration/*等价于创建了一个XML文件,<bean></bean>*/
@ComponentScan("com.zhl")/*等价于 <context:component-scan base-package="com.zhl"></context:component-scan>*/
@PropertySource("classpath:db.properties")/*引入外部文件,配置数据库信息*/
public class JavaConfig {
    @Value("${mysql.username}")
    private String name;
    @Value("${mysql.password}")
    private String password;
    @Value("${mysql.url}")
    private String url;
    @Value("${mysql.driverClassName}")
    private String driverName;
    
    @Bean//可以干预Bean实例化的过程
    public DruidDataSource dataSource(){
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setName(name);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverName);
        return dataSource;
    }
    //init‐method="initByConfig" destroy‐method="destroyByConfig"
    @Bean(initMethod = "initByConfig",destroyMethod = "destroyByConfig")
    public User userinfo(){
        return new User();
    }
}
package com.zhl.entity;


import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.Map;

/**
 *  生命周期回调
 *  1. 使用接口的方式实现:
 *      1.初始化回调   实现InitializingBean   重写afterPropertiesSet
 *      2.销毁回调     实现DisposableBean   重写destroy
 *  2. 基于配置的方式实现
 */
@Controller
public class User  {
    private Integer id;
    private String username;
    private String realname;
    private Role role;
    private List<String> hobbies;
    private Map<Integer,String> course;;

    public User() {

    }


    public void initByConfig() throws Exception{
        System.out.println("实例化User");
    }

    public void destroyByConfig() throws Exception {
        System.out.println("销毁User");
    }
}

2.2、使用AnnotationConfigApplicationContext初始化Spring容器简单结构

public class IocTest {
    @Test
    public void test0(){
        ApplicationContext ioc=new AnnotationConfigApplicationContext(JavaConfig.class);
        UserController bean = ioc.getBean(UserController.class);
        bean.getUser();
    }
}

2.3、@Bean 注解

2.3.1、声明一个Bean

@Bean是一个方法级别的注解,它与XML中的 元素类似。注解支持 提供的一 些属性,例如init-methoddestroy-methodautowiringname 开发者可以在@Configuration类或@Component类中使用@Bean注解

package com.zhl;

import com.zhl.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public User user(){
        return new User();
    }
}

前面的配置完全等同于以下Spring XML:

<bean id="user" class="com.zhl.entity.User"></bean>

2.3.2、Bean之间的依赖

可以使用方法参数来实现依赖关系,如以下示例所示:

package com.zhl;

import com.zhl.entity.Role;
import com.zhl.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public User user(Role role){
        return new User(role);
    }
    @Bean
    public Role role(){
        return new Role();
    }
}

2.3.3、接受生命周期回调

@Bean(initMethod = "initByConfig",destroyMethod = "destroyByConfig")
public User userinfo(){
    return new User();
}

2.3.4、指定Bean的作用域

@Scope("prototype")
public User user(){
    return new User();
}

2.3.5、自定义Bean的名字

@Configuration
public class AppConfig {
    /*默认情况下,配置类使用@Bean方法的名称作为结果bean的名称。
    但是,可以使用name属性覆盖此功能,如以下示例所示:*/
    @Bean(name = {"user2","user3","user4"})
    @Scope("prototype")
    public User user(){
        return new User();
    }
}

2.4、@Configuration 注解

2.4.1、注入内部Bean依赖

@Configuration
public class AppConfig {
    /*当Bean彼此有依赖关系时,表示依赖关系就像调用另一个bean方法一样简单.如下例所示:*/
    @Bean
    public User user(){
        return new User(role());
    }
    @Bean
    public Role role(){
        return new Role();
    }
}

2.5、构成基于Java的配置

@Import注解

功能就是和Spring XML 里面的一样. @Import注解是用来导入配置类或者一些需要前置加载的类.

@Configuration
public class AppConfig {
    @Bean
    public User user(){
        return new User();
    }
}
@Configuration
@Import(AppConfig.class)
public class AppConfig2 {
    @Bean
    public Role role(){
        return new Role();
    }
}
public class IocTest {
    @Test
    public void test0(){
        ApplicationContext ioc=new AnnotationConfigApplicationContext(AppConfig2.class);
        User bean = ioc.getBean(User.class);
        System.out.println(bean.toString());//User{id=null, username='null', realname='null', role=null}
    }
}