在学习springboot之前,学习一下Spring的java配置。

1. Spring的发展

1.1. Spring1.x 时代

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

1.2. Spring2.x时代

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

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

最佳实践:

1、 应用的基本配置用xml,比如:数据源、资源文件等;

2、 业务开发用注解,比如:Service中注入bean等;

1.3. Spring3.x到Spring4.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配置,列举的还不够全面, 以后有机会再修改。

Spring Boot 前期篇的更多相关文章

  1. Spring boot 提高篇

    Spring boot 提高篇 上篇文章介绍了Spring boot初级教程:构建微服务:Spring boot 入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续 ...

  2. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  3. 持续集成之 Spring Boot 实战篇

    本文作者: CODING 用户 - 何健 这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程.本教程还有 B 站视频版,帮助读者更好 ...

  4. spring boot入门篇

    Spring Boot[快速入门]   Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point ...

  5. spring boot入门篇,helloworld案例演示

    为什么用spring boot? 嵌入的 Tomcat,无需部署 WAR 文件 简化 Maven 配置 无需 XML 配置,轻松快速地搭建Spring Web应用 开始学习SpringBoot 构建简 ...

  6. Springboot 系列(一)Spring Boot 入门篇

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 由于 J2EE 的开发变得笨重,繁多的配置, ...

  7. 构建微服务:Spring boot 入门篇

    什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而 ...

  8. Spring boot 入门篇

    详见:https://www.cnblogs.com/ityouknow/p/5662753.html 什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架, ...

  9. spring boot 基础篇 -- 定时任务

    在日常项目中,常常会碰到定时监控项目中某个业务的变化,下面是spring boot 集成的定时任务具体配置: @Component public class IndexWarningScheduled ...

随机推荐

  1. [转帖]Linux systemd 常用命令

    Linux systemd 常用命令 https://www.cnblogs.com/tsdxdx/p/7288490.html systemctl hostnamectl timedatectl l ...

  2. SQL0668N Operation not allowed for reason code "3" on table "TEST". SQLSTATE=57016

    问题描述: 查询,操作表都报如下错误 SQL0668N  Operation not allowed for reason code "3" on table "TEST ...

  3. Ural 1298 Knight 题解

    目录 Ural 1298 Knight 题解 题意 题解 程序 Ural 1298 Knight 题解 题意 给定一个\(n\times n(1\le n\le8)\)的国际象棋棋盘和一个骑士(基本上 ...

  4. lg 1478

    好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...

  5. 分享一些JVM常见的面试题(转)

    出处:  分享一些JVM常见的面试题 前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 ...

  6. 消息服务百科全书——High Availability

    1.1为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消 费,这与Kafka数据 ...

  7. Memcached和Spring集成开发

    xml配置文件 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" facto ...

  8. vue项目build 之后,css文件加载图片或者字体文件时404的解决。

    ExtractTextWebpackPlugin 提供了一个 options.publicPath 的 api,可以为css单独配置 publicPath . 对于用 vue-cli 生成的项目,di ...

  9. LASSO回归与L1正则化 西瓜书

    LASSO回归与L1正则化 西瓜书 2018年04月23日 19:29:57 BIT_666 阅读数 2968更多 分类专栏: 机器学习 机器学习数学原理 西瓜书   版权声明:本文为博主原创文章,遵 ...

  10. ButterKnife8.5.1最新版本使用详细步骤

    android studio中使用方法: 1.build.gradle(Modul: app) 添加dependencies{ compile 'com.jakewharton:butterknife ...