• Spring Boot 前期篇


    在学习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.xSpring4.x

    Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.xSpring boot都推荐使用java配置的方式。

    ava配置是Spring4.x推荐的配置方式,可以完全替代xml配置。

    2.1.1. @Configuration @Bean

    SpringJava配置方式是通过 @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>
    View Code

       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;
        }
    }
    View Code

      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;
        }
    }
    View Code

      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();
            }
        }
    }
    View Code

      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对象做演示
            }
    }
    View Code

      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();
        
        
        
        
        }
    }
    View Code

      结果:

      

    总结:

      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>  
    View Code

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

  • 相关阅读:
    Django会话之session(手动设置)
    Django model字段类型参考列表
    Django会话之cookie(手动设置)
    Java AES加密
    Java AES加密
    Java JDBC
    Java JDBC
    Java-Map
    Java-Map
    Java-螺旋方阵
  • 原文地址:https://www.cnblogs.com/muxi0407/p/8922071.html
Copyright © 2020-2023  润新知