
正文
Spring Boot 前期篇
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
在学习springboot之前,学习一下Spring的java配置。
1.
Spring的发展
1.1.
Spring
1.
x
时代
在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
1.2. Spring 2. x时代
随着JDK 1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。
那么,问题来了,究竟是应该使用xml还是注解呢?
最佳实践:
1、 应用的基本配置用xml,比如:数据源、资源文件等;
2、 业务开发用注解,比如:Service中注入bean等;
1.3. Spring 3. x到Spring 4. x
从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.x和Spring boot都推荐使用java配置的方式。
ava配置是Spring4.x推荐的配置方式,可以完全替代xml配置。
2.1.1. @Configuration 和 @Bean
Spring的Java配置方式是通过 @Configuration 和 @Bean 这两个注解实现的:
1、@Configuration 作用于类上,相当于一个xml配置文件;
2、@Bean 作用于方法上,相当于xml配置中的<bean>;
示例:
先简单的展示一下,代码结构:
1.引入jar包依赖关系--pom.xml
<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.itcast.springboot</groupId>
<artifactId>itcast-springboot</artifactId>
<version>1.0.0-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>
<!-- 添加mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</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>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.实体类 User.java
package com.itcast.entity;
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.操作数据库类 UserDao.java
package com.itcast.dao; import java.util.ArrayList;
import java.util.List; import com.itcast.entity.User; public class UserDao {
public List<User> queryUserList(){
List<User> result = new ArrayList<User>();
// 模拟数据库的查询
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("username_" + i);
user.setPassword("password_" + i);
user.setAge(i + 1);
result.add(user);
}
return result;
}
}
4.业务逻辑类
package com.itcast.service; import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.itcast.dao.UserDao;
import com.itcast.entity.User;
@Service
public class UserService {
@Autowired
private UserDao userDao; @Autowired
private DataSource dataSource; public List<User> queryUserList(){
return userDao.queryUserList();
} public void getConnected(){
try {
Connection conn = dataSource.getConnection();
boolean flag = conn.createStatement().execute("insert into user(username,password,age)values('张飞','123456',25);");
System.out.println(flag);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5.Spring的java配置类
package com.itcast.config; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import com.itcast.dao.UserDao;
import com.jolbox.bonecp.BoneCPDataSource; @Configuration//通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages = "com.itcast")//配置扫描包
//@PropertySource(value = {"classpath:jdbc.properties", "classpath:database.properties"})
@PropertySource(value = {"classpath:jdbc.properties"})//引入文件
public class SpringConfig { @Value("${driver}") //获取引入文件的数据
private String driver; @Value("${url}") //获取引入文件的数据
private String url; @Value("${user}") //获取引入文件的数据
private String user; @Value("${password}") //获取引入文件的数据
private String password; @Bean(destroyMethod = "close") //当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用
public DataSource dataSource() {
BoneCPDataSource boneCPDataSource = new BoneCPDataSource();
// 数据库驱动
boneCPDataSource.setDriverClass(driver);
// 相应驱动的jdbcUrl
boneCPDataSource.setJdbcUrl(url);
// 数据库的用户名
boneCPDataSource.setUsername(user);
// 数据库的密码
boneCPDataSource.setPassword(password);
// 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0
boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60);
// 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0
boneCPDataSource.setIdleMaxAgeInMinutes(30);
// 每个分区最大的连接数
boneCPDataSource.setMaxConnectionsPerPartition(100);
// 每个分区最小的连接数
boneCPDataSource.setMinConnectionsPerPartition(5);
return boneCPDataSource;
} @Bean
public UserDao getUserDAO(){
System.out.println(driver);
return new UserDao(); // 直接new对象做演示
}
}
6.测试类
package com.itcast.test; import java.util.List; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.itcast.config.SpringConfig;
import com.itcast.entity.User;
import com.itcast.service.UserService; 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.queryUserList();
for (User user : list) {
System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
} //插入数据
userService.getConnected();
// 销毁该容器
context.destroy(); }
}
结果:
总结:
1.如何引入多个文件?
多个文件用“,”间隔开,@PropertySource(value = {"classpath:jdbc.properties", "classpath:database.properties"})
2.当引入的文件不存在?
3.@Bean(destroyMethod = "close") //当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用
4.@ComponentScan(basePackages = "com.itcast") 扫描包配置的时候,一定要包含所有的含注解的文件
5.DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较?
推荐博客:https://www.cnblogs.com/maxlei/p/5954133.html
6.关于BoneCP的xml文件配置
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<!-- 数据库驱动 -->
<property name="driverClass" value="${aliLibrary.db.driverClass}" />
<!-- 相应驱动的jdbcUrl,你懂的 -->
<property name="jdbcUrl" value="${aliLibrary.db.jdbcUrl}" />
<!-- 数据库的用户名 -->
<property name="username" value="${aliLibrary.db.username}" />
<!-- 数据库的密码 -->
<property name="password" value="${aliLibrary.db.password}" />
<!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
<property name="idleConnectionTestPeriod" value="${aliLibrary.db.idleConnectionTestPeriod}" />
<!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
<property name="idleMaxAge" value="${aliLibrary.db.idleMaxAge}" />
<!-- 每个分区最大的连接数 -->
<property name="maxConnectionsPerPartition" value="${aliLibrary.db.maxConnectionsPerPartition}" />
<!-- 每个分区最小的连接数 -->
<property name="minConnectionsPerPartition" value="${aliLibrary.db.minConnectionsPerPartition}" />
<!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定-->
<property name="partitionCount" value="${aliLibrary.db.partitionCount}" />
<!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->
<property name="acquireIncrement" value="${aliLibrary.db.acquireIncrement}" />
<!-- 缓存prepared statements的大小,默认值:0 -->
<property name="statementsCacheSize" value="${aliLibrary.db.statementsCacheSize}" />
<!-- 每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能 -->
<property name="releaseHelperThreads" value="${aliLibrary.db.releaseHelperThreads}" />
</bean>
7.创建Maven web项目时 出现 web.xml is missing and <failOnMissingWebXml> is set to true错误 pox.xml编译错误
推荐博客:https://www.cnblogs.com/zhouyantong/p/6218157.html
8.本次采用的是spring的java配置,列举的还不够全面, 以后有机会再修改。








