SpringBoot学习(二)-->Spring的Java配置方式
二、Spring的Java配置方式
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置。
1、@Configuration 和 @Bean
Spring的Java配置方式是通过 @Configuration 和 @Bean 这两个注解实现的:
1、@Configuration 作用于类上,相当于一个xml配置文件;
2、@Bean 作用于方法上,相当于xml配置中的<bean>;
2、示例
该示例演示了通过Java配置的方式进行配置Spring,并且实现了Spring IOC功能。
工程结构图:
1) 创建工程以及pom.xml文件导入依赖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.mmzs.springboot</groupId> <artifactId>mmzs-springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.7.RELEASE</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp-spring</artifactId> <version>0.8.0.RELEASE</version> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java编译插件 --> <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> <!-- pom.xml的war报错解决方法 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <span style="white-space:pre;"> </span> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat8-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
2) 编写User对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.mmzs.springboot.entity; 2 3 /** 4 * @author: mmzs 5 * @date: 2018年6月26日 6 * @Description: 7 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 8 * @version V1.0 9 */ 10 public class User { 11 12 private String uname; 13 14 private String upassword; 15 16 private Integer uage; 17 18 private String email; 19 20 public String getUname() { 21 return uname; 22 } 23 24 public void setUname(String uname) { 25 this.uname = uname; 26 } 27 28 public String getUpassword() { 29 return upassword; 30 } 31 32 public void setUpassword(String upassword) { 33 this.upassword = upassword; 34 } 35 36 public Integer getUage() { 37 return uage; 38 } 39 40 public void setUage(Integer uage) { 41 this.uage = uage; 42 } 43 44 public String getEmail() { 45 return email; 46 } 47 48 public void setEmail(String email) { 49 this.email = email; 50 } 51 52 }
3) 编写UserDAO用于模拟与数据库的交互
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.mmzs.springboot.dao; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import cn.mmzs.springboot.entity.User; 7 8 /** 9 * @author: mmzs 10 * @date: 2018年6月26日 11 * @Description: 12 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 13 * @version V1.0 14 */ 15 public class UserDao { 16 17 public List<User> queryUserList(){ 18 List<User> result = new ArrayList<User>(); 19 // 模拟数据库的查询 20 for (int i = 0; i < 10; i++) { 21 User user = new User(); 22 user.setUname("username_" + i); 23 user.setUpassword("password_" + i); 24 user.setUage(i + 1); 25 user.setEmail("mmzsblog"+i+"@163.com"); 26 result.add(user); 27 } 28 return result; 29 } 30 31 }
4) 编写UserService用于实现User数据操作业务逻辑
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.mmzs.springboot.service; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Service; 7 8 import cn.mmzs.springboot.dao.UserDao; 9 import cn.mmzs.springboot.entity.User; 10 11 /** 12 * @author: mmzs 13 * @date: 2018年6月26日 14 * @Description: 15 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 16 * @version V1.0 17 */ 18 @Service 19 public class UserService { 20 21 @Autowired // 注入Spring容器中的bean对象 22 private UserDao userDao; 23 24 public List<User> queryUserList() { 25 // 调用userDao中的方法进行查询 26 return this.userDao.queryUserList(); 27 } 28 29 }
5) 编写SpringConfig用于实例化Spring容器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.mmzs.springboot.javaconfig; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.ComponentScan; 5 import org.springframework.context.annotation.Configuration; 6 7 import cn.mmzs.springboot.dao.UserDao; 8 9 /** 10 * @author: mmzs 11 * @date: 2018年6月26日 12 * @Description: 13 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 14 * @version V1.0 15 */ 16 @Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件 17 @ComponentScan(basePackages = "cn.mmzs.springboot") //配置扫描包 18 public class SpringConfig { 19 20 @Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean> 21 public UserDao getUserDAO(){ 22 return new UserDao(); // 直接new对象做演示 23 } 24 25 }
注:1、SpringConfig会先扫描cn.mmzs.springboot包,然后在容器内查找被@Configuration声明的类,找到后将这些类按照bean定义进行注册。
2、方法名不建议使用getXxxx的方式,因为使用spring的java配置的时候会默认将方法名作为bean的id。
6) 编写测试方法用于启动Spring容器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package cn.mmzs.springboot.main; 2 3 import java.util.List; 4 5 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 6 7 import cn.mmzs.springboot.entity.User; 8 import cn.mmzs.springboot.javaconfig.SpringConfig; 9 import cn.mmzs.springboot.service.UserService; 10 11 /** 12 * @author: mmzs 13 * @date: 2018年6月26日 14 * @Description: 15 * springboot注解详解:http://www.cnblogs.com/mmzs/p/8874349.html 16 * @version V1.0 17 */ 18 public class JavaConfigMain { 19 20 public static void main(String[] args) { 21 // 通过Java配置来实例化Spring容器 22 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); 23 24 // 在Spring容器中获取Bean对象 25 UserService userService = context.getBean(UserService.class); 26 27 // 调用对象中的方法 28 List<User> list = userService.queryUserList(); 29 for (User user : list) { 30 System.out.println("测试结果:\n"+user.getUname() + ", " + user.getUpassword() + ", " 31 + user.getUage() + ", " + user.getEmail()); 32 } 33 34 // 销毁该容器 35 context.destroy(); 36 } 37 38 }
7) 测试效果
测试结果: username_0, password_0, 1, mmzsblog0@163.com 测试结果: username_1, password_1, 2, mmzsblog1@163.com 测试结果: username_2, password_2, 3, mmzsblog2@163.com 测试结果: username_3, password_3, 4, mmzsblog3@163.com 测试结果: username_4, password_4, 5, mmzsblog4@163.com 测试结果: username_5, password_5, 6, mmzsblog5@163.com 测试结果: username_6, password_6, 7, mmzsblog6@163.com 测试结果: username_7, password_7, 8, mmzsblog7@163.com 测试结果: username_8, password_8, 9, mmzsblog8@163.com 测试结果: username_9, password_9, 10, mmzsblog9@163.com
8) 小结
从以上的示例中可以看出,使用Java代码就完美的替代xml配置文件,并且结构更加的清晰。
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。
由@Bean注解的 方法将会实例化、配置和初始化一个 新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。
被 @Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的 内部调用@bean方法来设置嵌入bean的依赖关系。