Spring Boot

83 阅读3分钟

Spring框架发展史

Spring1.x 时代

在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。

Spring2.x时代

随着JDK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。

那么,问题来了,究竟是应该使用xml还是注解呢?

最佳实践:

  1. 应用的基本配置用xml,比如:数据源、资源文件等;
  2. 业务开发用注解,比如: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"));
    }
}