spring 的java配置方式
1. spring 1.x时代
通过xml配置bean
2. spring 2.x时代
支持注解
应用基本配置用xml 如:数据源 资源文件
业务开发用注解如: service注入bean
3. spring 3.x到4.x
开始提供java配置方式,推荐 java配置取代xml
@Configuration 和 @Bean
@Configuration作用于类,相当于一个xml文件
@Bean作用于方法上,相当于xml中的Bean
demo:
- 先写一个User POJO
public class User {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
- 编写UserDAO
public class UserDao{
public List<User> getUserList()
{...//从数据库中查用户列表}
}
//这里模拟从数据库中取到数据
public class UserDao {
public List<User> getUserList()
{
List<User> list = new ArrayList<>();
for (int i = 0; i <5; i++) {
User u = new User();
u.setName("L"+i);
u.setSex(i%2+"");
list.add(u);
}
return list;
}
}
- 编写UserService实现业务逻辑
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> getUserList(){
return this.userDao.getUserList();
}
}
- 编写SpringConfig配置类
@Configuration
@ComponentScan(basePackage = "com...*") //扫描包
在扫描的路径下,如果某个类的头上带有特定的注解如:@Component/@Repository/@Service/@Controller,
就会将这个对象作为Bean注册进Spring容器。
@Configuration
@ComponentScan(basePackages = "com.tsrain.spring_java_configuration")
public class SpringConfig {
@Bean
public UserDao getUserDao ()
{
return new UserDao();
}
}
- 编写main函数测试
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean(UserService.class);
List<User> list = userService.getUserList();
for (User user:list) {
System.out.println(user.getName()+" "+ user.getSex());
}
context.destroy();
}
}
运行结果
image.png
demo目录结构
目录.png
文件关系:
demo实现.png
关于bean类型注释的补充
指定Bean名称
如果@Controller等注释不指定其value,则默认的bean名字为这个类的类名首字母小写.
如果指定value,@Controller(value="UserAction")或者@Controller("UserAction"),则使用value作为bean的名字。
指定Bean模式
@Scope注解
@Scope("prototype")来保证每一个请求有一个单独的Action来处理,避免线程安全问题。
@Scope(scope="singleton")是spring 默认的单例模式,这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全。
读取外部资源文件
可用于创建数据源
配置的类上面加注释
@PropertySource(value = "classpath:jdbc.properties",ignoreResourceNotFound=true)
取资源值时用 @Value("${jdbc.driverClassName}")注释变量注入这种类似方式。
读取xml配置文件
@ImportResource({"classpath:a-context.xml","classpath:another-context.xml"})
示例
- 资源文件映射到bean中
@Configuration
@ConfigurationProperties(prefix="com.tsrain")
@PropertySource(value="classpath:my.properties")
public class MyResource {
private String name;
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
my.properties
com.tsrain.name= NB
com.tsrain.url=www.666.com