一. 问题背景
在面试题中“Spring是什么”中说到“Spring的3种配置方式有:基于xml方式;基于注解方式;基于Java配置”,笔者不懂基于Java配置,所以今天了解一下。
此笔记仅供自己参考,如有错误请指正
二. 基于Java方式配置Spring
2.1 @Configuration 和 @Bean
@Configuration:该注释标注在一个类上面,则表明该类是一个配置类,其作用相当于spring中配置Bean的xml文件,其含义是该类是Spring IOC容器的Bean的来源。
@Bean:该注释标注在一个方法上面,则其作用相当于<bean>
标签。是用来配置一个bean的。该方法的返回值是<bean>
标签的class属性,<bean>
的id属性默认是方法名。
例子:
package cn.qlq;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration // 通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages = "cn.qlq") // 配置扫描包
public class SpringConfig {
@Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
public UserDao getUserDAO() {
return new UserDao(); // 直接new对象做演示
}
}
public class Test {
public static void main(String[] args) {
// 通过Java配置来实例化Spring容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// 在Spring容器中获取Bean对象
UserService userService = context.getBean(UserService.class);
// 调用对象中的方法
List<User> list = userService.queryUserList();
for (User user : list) {
System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
}
// 销毁该容器
context.destroy();
}
}
例子:
@Configuration
public class AppConfig{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
相当于xml文件中的
<beans>
<bean id="myService" class="com.somnus.services.MyServiceImpl"/>
</beans>