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-method、destroy-method、autowiring、name 开发者可以在@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}
}
}