Spring框架发展史
Spring1.x 时代
在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
Spring2.x时代
随着JDK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。
那么,问题来了,究竟是应该使用xml还是注解呢?
最佳实践:
- 应用的基本配置用xml,比如:数据源、资源文件等;
- 业务开发用注解,比如:Service中注入bean等;
Spring3.x到Spring4.x再到Spring5.x
从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.x、Spring5.x和Spring Boot都推荐使用java配置的方式。
Spring 5.X 应用零配置开发
Spring 框架从5.x版本推荐使用注解形式来对java应用程序进行开发与配置,并且可以完全替代原始的XML+注解形式的开发,在使用注解形式进行项目开发与环境配置时,Spring 框架提供了针对环境配置与业务bean开发相关注解。
注解
声明Bean 注解
@Component:组件 没有明确规定其角色,作用在类级别上声明当前类为一个业务组件,被Spring Ioc 容器维护;
@Service:在业务逻辑层(Service 层)类级别进行声明;
@Repository:在数据访问层(dao 层) 类级别声明;
@Controller:在展现层(MVC) 使用 标注当前类为一个控制器
注入Bean 注解
@AutoWired:Spring 官方提供注解
@Inject:JSR-330 提供注解(标准制定方)
@Resource:JSR-250 提供注解
以上三种注解在Set 方法或属性上声明,一般情况下通用一般开发中更习惯声明在属性上,代码简洁清晰。基于5.x 注解配置方式简化了xml 配置,应用程序开发与xml 环境配置均通过相应注解来实现。
Spring5.x 中配置与获取Bean注解
@Configuration:作用与类上,将当前类声明为一个配置类,相当于一个xml 配置文件
@ComponentScan:自动扫描指定包下标注有@Repository,@Service,@Controller
@Component:注解的类并由Ioc 容器进行实例化和维护
@Bean::作用于方法上,相当于xml 文件中<bean> 声明当前方法返回值为一个bean
@Value:获取properties 文件指定key value值
实例1-Ioc中Bean的实例化与获取
创建Spring 普通工程并添加坐标相关配置
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
添加源代码
创建UserDao ,UserService Bean 对象
// UserDao.java
@Repository
public class UserDao {
public void test(){
System.out.println("UserDao.test...");
}
}
// UserService.java
@Service
public class UserService {
@Resource
private UserDao userDao;
public void test(){
System.out.println("UserService.test...");
userDao.test();
}
}
创建IocConfig配置类
// Ioc 容器配置 Java 代码实现
@Configuration
@ComponentScan("com.xxxx.springboot")
public class IocConfig {
}
创建启动类执行测试
public class Starter {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(IocConfig.class);
UserService userService= ac.getBean(UserService.class);
userService.test();
}
}
此时启动Spring Ioc 容器通过实例化AnnotationConfigApplicationContext类,接收配置参数类IocConfig,并获取UserService Bean 实现方法调用,此时应用环境不存在xml配置文件,简化了应用的xml 配置。
使用@Bean注解声明在方法(注意:方法名一般为bean对象名称)级别用于返回实例化的Bean对象。
@Bean注解使用
定义AccountDao 对象,并交给Spring Ioc 容器进行实例化
// 注意 此时类级别并未添加 @Repository 注解
public class AccountDao {
public void test(){
System.out.println("AccountDao.test...");
}
}
修改IocConfig 配置类中添加返回AccountDao Bean对象方法
@Configuration
@ComponentScan("com.xxxx.springboot")
public class IocConfig {
// 返回实例化的单例Bean对象
@Bean
public AccountDao accountDao(){
return new AccountDao();
}
}
UserService 中注入AccountDao 对象
@Service
public class UserService {
@Resource
private UserDao userDao;
@Resource
private AccountDao accountDao;
public void test(){
System.out.println("UserService.test...");
userDao.test();
accountDao.test();
}
}
执行测试
public class Starter {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(IocConfig.class);
UserService userService= ac.getBean(UserService.class);
userService.test();
System.out.println(ac.isSingleton("accountDao"));
}
}