Java的基础框架之Spring第二讲(注解开发)

Spring

Spring第二讲

Spring第三方资源配置管理

管理DataSource连接池对象

管理Druid连接池
添加Druid连接池依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
注意

除了添加以上两个依赖之外,别忘了添加spring-context依赖

配置DruidDataSource连接池Bean对象
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>
在测试类中从IOC容器中获取连接池对象并打印
public class TestDemo {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        DataSource dataSource = (DataSource) ctx.getBean("dataSource");
        System.out.println(dataSource);
    }
}
管理c3p0连接池
添加c3p0连接池依赖
<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>
配置c3p0连接池Bean对象
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
    <property name="maxPoolSize" value="1000"/>
</bean>
注意

同一个Spring容器中不能有两个id="dataSource"的连接池

在测试类中从IOC容器中获取连接池对象并打印
public class TestDemo {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        DataSource dataSource = (DataSource) ctx.getBean("dataSource");
        System.out.println(dataSource);
    }
}

加载properties属性文件

properties基本用法
编写jdbc.properties属性文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mydb
jdbc.username=root
jdbc.password=root
在applicationContext.xml中开启开启context命名空间,加载jdbc.properties属性文件

properties命名空间1

小技巧

如果觉得复制粘贴方式不好改或者容易改错,其实idea是有提示功能的,注意不要选错就行了。有些版本的idea没有这个提示,那么就按照上面复制粘贴的方式改,改完之后可以做成live template模板,后期可以直接用

properties命名空间2

<context:property-placeholder location="jdbc.properties"/>
在配置连接池Bean的地方使用EL表达式获取jdbc.properties属性文件中的值
<bean class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

配置完成之后,运行之前的获取Druid连接池代码,可以获取到连接池对象就表示配置成功

配置不加载系统属性
问题

如果属性文件中配置的不是jdbc.username,而是username=root666,那么使用${username}获取到的不是root666,而是计算机的名称

原因

系统属性的优先级比我们属性文件中的高,替换了我们的username=root666

解决

解决1:换一个名称,例如不叫username,叫jdbc.username

解决2:使用system-properties-mode="NEVER"属性表示不使用系统属性

<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
加载properties文件写法
  • 不加载系统属性
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
  • 加载多个properties文件
<context:property-placeholder location="jdbc.properties,msg.properties"/>
  • 加载所有properties文件
<context:property-placeholder location="*.properties"/>
  • 加载properties文件标准格式
<context:property-placeholder location="classpath:*.properties"/>
  • 加载properties文件标准格式
<context:property-placeholder location="classpath*:*.properties"/>

Spring容器

Spring核心容器介绍

创建容器
方式一

类路径加载配置文件

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
方式二

文件路径加载配置文件

ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");

加载多个配置文件

ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");
获取bean对象
方式一

使用bean名称获取

弊端

需要自己强制类型转换

BookDao bookDao = (BookDao) ctx.getBean("bookDao");
方式二

使用bean名称获取并指定类型

弊端

推荐使用

BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
方式三

使用bean类型获取

弊端

如果IOC容器中同类型的Bean对象有多个,此处获取会报错

BookDao bookDao = ctx.getBean(BookDao.class);
容器类层次结构

容器类层次结构

BeanFactory
类路径加载配置文件
Resource resources = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(resources);
BookDao bookDao = bf.getBean("bookDao", BookDao.class);
bookDao.save();

BeanFactory创建完毕后,所有的Bean均为延迟加载,也就是说我们调用getBean()方法获取Bean对象时才创建Bean对象并返回给我们

Spring核心容器总结

容器相关
  • BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
  • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
  • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
  • ApplicationContext接口常用初始化类
    • ClassPathXmlApplicationContext(常用)
    • FileSystemXmlApplicationContext
bean相关

Bean容器

依赖注入相关

依赖注入

Spring注解开发

注解开发定义Bean对象

基本使用
在applicationContext.xml中开启Spring注解包扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	 <!--扫描com.itheima包及其子包下的类中注解-->
    <context:component-scan base-package="com.baiyang"/>
</beans>
在类上使用@Component注解定义Bean
//@Component定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
@Component
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
注意

如果@Component注解没有使用参数指定Bean的名称,那么类名首字母小写就是Bean在IOC容器中的默认名称

例如:BookServiceImpl对象在IOC容器中的名称是bookServiceImpl

在测试类中获取Bean对象
public class AppForAnnotation {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
        //按类型获取bean
        BookService bookService = ctx.getBean(BookService.class);
        System.out.println(bookService);
    }
}
注意

在测试类中不要调用bookService的save方法,因为还没有给BookServiceImpl中的bookDao赋值,调用bookService的save方法会出现空指针异常

运行结果

Spring注解开发基本使用运行结果

@Component三个衍生注解

Spring提供@Component注解的三个衍生注解

  • @Controller:用于表现层bean定义
  • @Service:用于业务层bean定义
  • @Repository:用于数据层bean定义
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
}

@Service
public class BookServiceImpl implements BookService {
}

纯注解开发模式

纯注解开发模式介绍

Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道

Java类代替Spring核心配置文件

纯注解开发模式介绍

@Configuration注解用于设定当前类为配置类

@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式

@ComponentScan({com.baiyang.service","com.baiyang.dao"})

读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象

//加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
代码实例

定义配置类代替配置文件

//声明当前类为Spring配置类
@Configuration
//Spring注解扫描,相当于<context:component-scan base-package="com.baiyang"/>
@ComponentScan("com.itheima")
//设置bean扫描路径,多个路径书写为字符串数组格式
//@ComponentScan({"com.baiyang.service","com.baiyang.dao"})
public class SpringConfig {
}

在测试类中加载配置类,获取Bean对象并使用

public class AppForAnnotation {
    public static void main(String[] args) {
        //AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
        //按类型获取bean
        BookService bookService = ctx.getBean(BookService.class);
        System.out.println(bookService);
    }
}
注解开发Bean作用范围和生命周期管理
bean作用范围注解配置

使用@Scope定义bean作用范围

@Repository
@Scope("singleton")
public class BookDaoImpl implements BookDao {
}
bean生命周期注解配置

使用@PostConstruct、@PreDestroy定义bean生命周期

@Repository
@Scope("singleton")
public class BookDaoImpl implements BookDao {
    public BookDaoImpl() {
        System.out.println("book dao constructor ...");
    }
    @PostConstruct
    public void init(){
        System.out.println("book init ...");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("book destory ...");
    }
}
注意

@PostConstruct和@PreDestroy注解是jdk中提供的注解,从jdk9开始,jdk中的javax.annotation包被移除了,也就是说这两个注解就用不了了,可以额外导入一下依赖解决这个问题

<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>

注解开发依赖注入

使用@Autowired注解开启自动装配模式
@Service
public class BookServiceImpl implements BookService {
    //@Autowired:注入引用类型,自动装配模式,默认按类型装配
    @Autowired
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默认按照类型自动装配,如果IOC容器中同类的Bean有多个,那么默认按照变量名和Bean的名称匹配,建议使用@Qualifier注解指定要装配的bean名称

注意

自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法

使用@Qualifier注解指定要装配的bean名称

解决IOC容器中同类型Bean有多个装配哪一个的问题

@Service
public class BookServiceImpl implements BookService {
    //@Autowired:注入引用类型,自动装配模式,默认按类型装配
    @Autowired
    //@Qualifier:自动装配bean时按bean名称装配
    @Qualifier("bookDao")
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
注意

@Qualifier注解无法单独使用,必须配合@Autowired注解使用

使用@Value实现简单类型注入
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    //@Value:注入简单类型(无需提供set方法)
    @Value("${name}")
    private String name;

    public void save() {
        System.out.println("book dao save ..." + name);
    }
}

以上@Value注解中使用${name}从属性文件中读取name值,那么就需要在配置类或者配置文件中加载属性文件

@Configuration
@ComponentScan("com.baiyang")
//@PropertySource加载properties配置文件
@PropertySource({"classpath:jdbc.properties"}) //{}可以省略不写
public class SpringConfig {
}

注意

@PropertySource()中加载多文件请使用数组格式配置,不允许使用通配符*

注解开发管理第三方Bean

步骤
单独定义配置类
public class JdbcConfig {
    //@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/mydb");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}
将独立的配置类加入核心配置
方式1
@Import注解导入式
@Configuration
@ComponentScan("com.baiyang")
//@Import:导入配置信息
@Import({JdbcConfig.class})
public class SpringConfig {
}
方式2
@ComponentScan扫描式
@Configuration
@ComponentScan({"com.baiyang.config","com.baiyang.service","com.baiyang.dao"})  //只要com.baiyang.config包扫到了就行,三个包可以合并写成com.itheima
public class SpringConfig {
}

注解开发为第三方Bean注入资源

简单类型依赖注入
public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/mydb")
    private String url;
    @Value("root")
    private String userName;
    @Value("123456")
    private String password;
    //2.@Bean:表示当前方法的返回值是一个bean对象,添加到IOC容器中
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

如果@Value()中使用了EL表达式读取properties属性文件中的内容,那么就需要加载properties属性文件

引用类型依赖注入
//Spring会自动从IOC容器中找到BookDao对象赋值给参数bookDao变量,如果没有就会报错。
@Bean 
public DataSource dataSource(BookDao bookDao){
    System.out.println(bookDao);
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ds.setUrl(url);
    ds.setUsername(userName);
    ds.setPassword(password);
    return ds;
}

引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

Spring整合其他技术

Spring整合mybatis

MyBatis程序核心对象分析

MyBatis程序核心对象分析

整合MyBatis

使用SqlSessionFactoryBean封装SqlSessionFactory需要的环境信息

整合MyBatis1

使用MapperScannerConfigurer加载Dao接口,创建代理对象保存到IOC容器中

整合MyBatis2

代码实例

在pom.xml中添加spring-context、druid、mybatis、mysql-connector-java等基础依赖

准备service和dao层基础代码

导入Spring整合Mybatis依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
创建JdbcConfig配置DataSource数据源
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
jdbc.username=root
jdbc.password=123456
public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}
创建MybatisConfig整合mybatis
public class MybatisConfig {
    //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.baiyang.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }
    //定义bean,返回MapperScannerConfigurer对象
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.baiyang.dao");
        return msc;
    }
创建SpringConfig主配置类进行包扫描和加载其他配置类
@Configuration
@ComponentScan("com.itheima")
//@PropertySource:加载类路径jdbc.properties文件
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}
定义测试类进行测试
public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        AccountService accountService = ctx.getBean(AccountService.class);

        Account ac = accountService.findById(1);
        System.out.println(ac);
    }
}

Spring整合Junit单元测试

导入整合的依赖坐标spring-test
<!--junit-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
</dependency>
<!--spring整合junit-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.1.9.RELEASE</version>
</dependency>
使用Spring整合Junit专用的类加载器
加载配置文件或者配置类
//【第二步】使用Spring整合Junit专用的类加载器
@RunWith(SpringJUnit4ClassRunner.class)
//【第三步】加载配置文件或者配置类
@ContextConfiguration(classes = {SpringConfiguration.class}) //加载配置类
//@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载配置文件
public class AccountServiceTest {
    //支持自动装配注入bean
    @Autowired
    private AccountService accountService;

    @Test
    public void testFindById(){
        System.out.println(accountService.findById(1));
    }

    @Test
    public void testFindAll(){
        System.out.println(accountService.findAll());
    }
}
注意

junit的依赖至少要是4.12版本,可以是4.13等版本,否则出现如下异常

junit整合

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Spring Boot是一个基于Java的开源框架,它提供了一系列工具和配置来帮助开发人员快速搭建新应用。 Spring Boot能够将应用程序部署到任何Java应用服务器,并提供了许多方便的功能,如自动配置、日志记录和应用监控。 如果你想学习使用Spring Boot开发应用程序,你可以从以下文档开始: 1. Spring Boot官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/ 2. Spring Boot入门指南: https://spring.io/guides/gs/spring-boot/ 3. Spring Boot教程: https://www.tutorialspoint.com/spring_boot/index.htm 这些文档将为你提供Spring Boot的基础知识,并帮助你开始使用Spring Boot开发应用程序。 ### 回答2: Spring Boot是一个用于简化Java开发框架,是基于Spring框架的一个子项目。Spring框架是一个非常强大和流行的Java开发框架,但是在配置方面可能较复杂。而Spring Boot的出现就是为了解决这个问题,它通过自动化配置和约定大于配置的原则,极大地简化了Spring应用的开发和部署过程。 Spring Boot的学习文档主要包括以下内容: 1. 简介和入门:文档首先会介绍Spring Boot的基本概念和背景,为什么要使用Spring Boot以及它的优势。然后,会帮助读者快速搭建一个简单的Spring Boot项目,并编写第一个Hello World程序。 2. 核心特性:文档将详细介绍Spring Boot的核心特性和功能,如自动配置、起步依赖、外部化配置和监控等。读者会了解到这些特性如何帮助开发人员更高效地开发应用程序。 3. Web开发Spring Boot在Web开发方面提供了很多方便的功能,如快速创建RESTful API、集成持久层框架和模板引擎等。学习文档将详细介绍如何使用Spring Boot进行Web开发,并提供一些常见场景的示例。 4. 数据访问:文档将介绍如何使用Spring Boot集成各种数据库和持久层框架,如JPA、MyBatis等,并提供最佳实践和示例代码。 5. 测试和部署:文档将介绍如何使用Spring Boot进行单元测试和集成测试,并提供一些常用的测试框架和工具。同时,也会介绍如何将Spring Boot应用部署到不同的环境中。 6. 扩展和配置:Spring Boot支持通过自定义配置文件、自定义Starter和自定义注解等方式进行扩展。文档将详细介绍如何使用这些扩展机制进行定制开发。 总体而言,Spring Boot学习文档会从入门到深入地介绍Spring Boot的各个方面,帮助读者快速掌握和应用Spring Boot框架。同时,文档也会提供丰富的示例代码和最佳实践,便于读者进行实践和理解。 ### 回答3: Spring Boot是一个基于Java的开源框架,用于快速构建独立的、生产级别的Spring应用程序。它的学习文档包含了以下几个方面: 1. 安装和配置:学习文档会介绍如何安装和配置Spring Boot框架,包括下载安装包、设置环境变量等等。 2. 快速入门:学习文档会提供一个简单的示例,帮助初学者快速了解Spring Boot的基本概念和用法。通过这个示例,学习者可以了解如何创建一个简单的Spring Boot应用,并通过内置的嵌入式服务器来运行应用。 3. 核心概念:学习文档会介绍Spring Boot框架的核心概念,如自动配置、起步依赖、外部化配置等。通过学习这些核心概念,学习者可以更好地理解和应用Spring Boot框架。 4. 高级特性:学习文档还会介绍一些Spring Boot的高级特性,如Spring Boot Actuator、Spring Boot Data等。这些特性可以帮助开发者更加方便地进行应用程序的监控和管理,以及数据库访问等操作。 5. 实战项目:学习文档可能会提供一些实战项目,供学习者根据文档步骤实践,并通过实践来深入理解Spring Boot框架的应用。 综上所述,Spring Boot的学习文档提供了从安装配置到核心概念再到高级特性的全面介绍,通过学习文档,可以帮助初学者快速上手Spring Boot框架,并深入理解和应用其功能特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值