1.Spring简介
1.1 Spring 全家桶
- Spring Framework (基础)
- Spring Boot
- Spring Cloud 微服务(项目大,拆分成若干子项目,再集成)
- Spring Cloud Data Flow (数据集成的功能)
1.2 Spring Framework
- Spring Core(IOC面向对象,AOP面向切面)
- Spring Data Access(Transaction,Spring MyBatis)
- Web Servlet (Spring MVC)
- Integration(Email,Scheduling,AMQP,Security)
1.3 Spring IOC
- Inverse of Control(控制反转,是一种面向对象的思想)
- Dependency Injection (依赖注入,IOC思想的实现方式)
- IOC Container (是实现依赖注入的方式,本质上是一个工厂)
2.Spring 基础
2.1 Spring的使用方法
根据官网介绍,大致要做两件事
- 提供Bean的类型
- 提供配置文件(描述Bean的关系)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DefaultTmpMvnApplication {
public static void main(String[] args) {
SpringApplication.run(DefaultTmpMvnApplication.class, args);
}
}
被@SpringBootApplication标注的类,就相当于配置文件。
Spring 让其被创建,会自动扫描某些包下的某些Bean,装配某些类
看@SpringBootApplication的底层
@SpringBootConfiguration
@EnableAutoConfiguration (自动配置)
@ComponentScan (组件扫描,会扫描某些配置类所在的包以及其子包)
具体扫描带有一下注解的
- @Component 任何地方都可以使用
- @Controller 处理请求
- @Service 业务组件
- @Repository 数据库访问
下面介绍相应用法
在项目目录中创建一个包,包名dao
创建一个接口,AlphaDao
public interface AlphaDao {
public String select();
}
两个实现,
import org.springframework.stereotype.Repository;
@Repository("AlphaDaoHibernate")
public class AlphaDaoHibernateImpl implements AlphaDao {
public String select() {
return "Hibernate";
}
}
加了注解@Repository,并且给了名字
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Repository
@Primary
public class AlphaDaoMyBatisImpl implements AlphaDao {
@Override
public String select() {
return "MyBatis";
}
}
@Primary指定了Spring容器自动加载这一类
测试类
import com.example.demo.dao.AlphaDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Test
void contextLoads() {
System.out.println(applicationContext);
}
@Test
void testApplicationContext2() {
AlphaDao alphaDao = applicationContext.getBean("AlphaDaoHibernate",AlphaDao.class);
System.out.println(alphaDao.select());
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
解释下定义该测试类的重点
@ContextConfiguration(class=类型) 指定了测试代码中设置配置类信息
实现了ApplicationContextAware接口,并且实现其中的setApplicationContext方法,该方法传入的参数就是我们要的Spring容器。把这个容器存在成员变量里边即可。
容器中的对象,默认是单例,如果想不是单例,则加一个@Scope('“prototype”)在Bean上
如何装配第三方类?
通过自己写一个配置类,通过Bean注解声明
定义一个配置类,类似于@SprintBootApplication ,用@Configuration足够
示例: 装配SimpleDateFormat
下文中的方法AlphaConfig,该方法返回的对象将会装配到容器里,对应的Bean的名字就是方法名
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
@Configuration
public class AlphaConfig {
@Bean
public SimpleDateFormat simpleDateFormat() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
测试(使用)上文定义的Bean
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import java.text.SimpleDateFormat;
import java.util.Date;
@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Test
void testBeanConfig(){
SimpleDateFormat simpleDateFormat
= applicationContext.getBean(SimpleDateFormat.class);
System.out.println(simpleDateFormat.format(new Date()));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
上文中,我们是主动获取容器拿来用,还有自动注入的方法
@Autowired 可以加载构造器前,也可以加在属性前
@Qualifier(“alphaHibernate”)
import com.example.demo.dao.AlphaDao;
import com.example.demo.service.AlphaService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import java.text.SimpleDateFormat;
@SpringBootTest
@ContextConfiguration(classes = DefaultTmpMvnApplication.class)
class DefaultTmpMvnApplicationTests {
@Autowired
@Qualifier("AlphaDaoHibernate")
private AlphaDao alphaDao;
@Autowired
private AlphaService alphaService;
@Autowired
private SimpleDateFormat simpleDateFormat;
@Test
void testAutowired(){
System.out.println(this.alphaDao);
System.out.println(this.alphaService);
System.out.println(this.simpleDateFormat);
}
}
Dependency Injection
依赖注入的优点:降低了耦合度,不用实例化