SpringBoot:快速入门

来自Wikioe
跳到导航 跳到搜索


Spring的发展

  1. Spring1.x:
    通过xml文件配置bean:随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
  2. Spring2.x:
    (JDK 1.5 注解支持)使用注解对Bean进行申明和注入:大大的减少了xml配置文件,同时也大大简化了项目的开发。
    1. 应用的基本配置用xml(如:数据源、资源文件等);
    2. 业务开发用注解(如:Service中注入bean等);
  3. Spring3.x(Spring4.x):
    推荐使用Java配置方式:可以完全替代xml配置。

Spring的Java配置方式

(Java配置是Spring4.x推荐的配置方式)
Spring的Java配置方式是通过 @Configuration 和 @Bean 这两个注解实现的:

  1. @Configuration:标记类,相当于一个xml配置文件;
  2. @Bean:标记方法,相当于xml配置中的“<bean>”;


其他配置类注解:

  1. 读取外部的资源配置文件:
    1. @PropertySource:指定读取的配置文件;
    2. @Value:获取配置文件的配置项;


示例:配置数据库连接池:

// 通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@Configuration
// 配置扫描包,相当于xml中的"<context:component-scan ...>"
@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig")
//加载配置文件
@PropertySource(value = { "classpath:jdbc.properties", "xxx.properties" }, ignoreResourceNotFound = true)
public class SpringConfig {

    @Bean
    // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
    //1、相当于xml中的<bean>标签
    //2、相当于类中的@Service类的注解
    //所以"UserDAO"可以用于"UserService"属性注入
    public UserDAO getUserDAO() {
        return new UserDAO(); // 直接new对象做演示
    }
    //返回值,相当于<bean>中的"class"属性
    //方法名称,相当于<bean>中的"id"属性?
    
    // 获取配置文件的配置项
    @Value("${jdbc.url}")
    private String jdbcUrl;

    @Value("${jdbc.driverClassName}")
    private String jdbcDriverClassName;

    @Value("${jdbc.username}")
    private String jdbcUsername;

    @Value("${jdbc.password}")
    private String jdbcPassword;

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        BoneCPDataSource boneCPDataSource = new BoneCPDataSource();
        // 数据库驱动
        boneCPDataSource.setDriverClass(jdbcDriverClassName);
        // 相应驱动的jdbcUrl
        boneCPDataSource.setJdbcUrl(jdbcUrl);
        // 数据库的用户名
        boneCPDataSource.setUsername(jdbcUsername);
        // 数据库的密码
        boneCPDataSource.setPassword(jdbcUsername);
        // 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0
        boneCPDataSource.setIdleConnectionTestPeriodInMinutes(60);
        // 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0
        boneCPDataSource.setIdleMaxAgeInMinutes(30);
        // 每个分区最大的连接数
        boneCPDataSource.setMaxConnectionsPerPartition(100);
        // 每个分区最小的连接数
        boneCPDataSource.setMinConnectionsPerPartition(5);
        return boneCPDataSource;
    }
}

实例

  1. 创建工程以及导入依赖:
    <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>
    	</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>
    		</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对象:
    public class User {
    
        private String username;
        private String password;
        private Integer age;
    
        // getter & setter & toString
    }
    
  3. 编写UserDao接口:
    public interface UserDaoUserDao {
        //根据id查询用户信息
    	public User findUserById(int id) throws Exception;
    }
    
  4. 编写UserDaoImpl接口:(mybatis)
    public class UserDaoImpl implements UserDao {
    
    	// 需要向dao实现类中注入SqlSessionFactory
    	// 这里通过构造方法注入
    	private SqlSessionFactory sqlSessionFactory;
    
    	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
    		this.sqlSessionFactory = sqlSessionFactory;
    	}
    
    	@Override
    	public User findUserById(int id) throws Exception {
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    
    		User user = sqlSession.selectOne("test.findUserById", id);
    		// 释放资源
    		sqlSession.close();
            
    		return user;
    	}
    }
    
  5. 编写UserService实现User数据操作业务逻辑:
    @Service
    public class UserService {
    
        @Autowired // 注入Spring容器中的bean对象
        private UserDaoImpl UserDaoImpl;
    
        public User findUserById(int id) throws Exception {
            // 调用userDAO中的方法进行查询
            return this.UserDaoImpl.findUserById(id);
        }
    }
    
  6. 编写SpringConfig用于实例化Spring容器
    @Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
    @ComponentScan(basePackages = "cn.itcast.springboot.javaconfig") //配置扫描包
    public class SpringConfig {
        
        @Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
        public UserDao getUserDao(){
            return new UserDao(); // 直接new对象做演示
        }
    }
    
  7. 编写测试方法,启动Spring容器
    public class Main {
        
        public static void main(String[] args) {
            // 通过Java配置来实例化Spring容器
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
            // 对比使用:使用xml方式的“加载spring配置文件”
            ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
            // 对比使用:使用xml方式的“根据配置创建对象”
            UserService userService = (UserService) context.getBean("userService");
            
            // 在Spring容器中获取Bean对象
            UserService userService = context.getBean(UserService.class);
            
            // 调用对象中的方法
            List<User> list = userService.queryUserList();
            for (User user : list) {
                System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
            }
            
            // 销毁该容器
            context.destroy();
        }
    }
    

实例化Spring容器:xml与Java配置

对比,“xml、注解”于“Java配置类”的实例化Spring容器:

    // 通过Java配置来实例化Spring容器
    // 1、Java配置类
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    // 2、xml、注解
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    // 在Spring容器中“获取Bean对象”
    // 1、Java配置类
    UserService userService = context.getBean(UserService.class);
    // 2、xml、注解
    UserService userService = (UserService) context.getBean("userService");

Spring Boot

“习惯优于配置”:

SpringBoot是一种全新的框架,目的是为了简化Spring应用的初始搭建以及开发过程。该框架使用特定的方式(集成starter,约定优于配置)来进行配置,从而使开发人员不需要再定义样板化的配置。

  • SpringBoot基于Sring4进行设计,继承了原有Spring框架的优秀基因。
  • SpringBoot并不是一个框架,而是一些类库的集合。
  • maven或者gradle项目导入相应依赖即可使用SpringBoot,而无需自行管理这些类库的版本。

优点:

  1. 快速创建基于Spring的应用程序。
  2. 无需手动管理依赖包的版本。
  3. 自动配置,无需XML。
  4. 嵌入式的Tomcat,无需部署war文件。

快速入门

设置spring boot的parent

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
	</parent>

Spring boot的项目必须要将parent设置为spring boot的parent,该parent包含了大量默认的配置,大大简化了我们的开发。

导入spring boot的web支持

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>

添加Spring boot的插件

	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
		<pluginManagement>
				...
		</pluginManagement>
	</build>

编写第一个Spring Boot的应用

@Controller
@SpringBootApplication
@Configuration
public class HelloApplication {
    
    @RequestMapping("hello")
    @ResponseBody
    public String hello(){
        return "hello world!";
    }
    
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}
  1. @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置;
  2. @Configuration:这是一个配置Spring的配置类;
  3. @Controller:标明这是一个SpringMVC的Controller控制器;
  4. main方法:在main方法中启动一个应用,即:这个应用的入口;

启动应用

在Spring Boot项目中,启动的方式有两种,一种是另外一种是。

  1. 直接run Java Application
    SpringBoot启动应用:RunAS ”Java Aplication“.png
  2. 通过Spring Boot的Maven插件运行
    SpringBoot启动应用:Maven插件运行.png

SpringBoot核心

自动配置的原理