【Spring】Spring入门
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Spring 入门
Spring 全家桶
- Spring Framework —— Spring 框架 基石
- Spring Boot —— 构建项目
- Spring Cloud —— 微服务
- Spring Cloud Data Flow —— 数据集成
本项目只用 Spring Framework 和 Spring Boot
Spring Core Spring IoC
依赖注入 实现的 IoC Container 依赖注入的关键 本质上是一个工厂。(我想到了 依赖倒置原则。)
Spring 容器 管理 Bean 的装配手段 获取 Bean
// Spring 容器 装配 Bean 的 基本方式
//定义 接口 Alpha 和 实现类 AlphaDaoHibernateImpl 、 AlphaDaoMyBatisImpl
/**
* 注解说明
* @Repository —— 该 类是 数据库 相关 @Repository("Bean_name") —— 指定该 Bean 的名字
* @Primary —— 若一个 interface 有多个 implements class 被该注解声明的类Bean 将被 Spring 容器 优先装配
*/
public interface AlphaDao {
String select();
}
@Repository("alphaHibernate") // 自定义这个 bean 的名字 为 alphaHibernate 通过 getBean 指定 name 字段 获取 特定的 接口实现类
public class AlphaDaoHibernateImpl implements AlphaDao {
@Override
public String select() {
return "J+Hibernate";
}
}
@Repository
@Primary // 该实现类 优先装配
public class AlphaDaoMyBatisImpl implements AlphaDao {
@Override
public String select() {
return "MybatisImpl";
}
}
// Test 测试类 ... 省略类 定义 直接给出 测试方法
/**
* 方法说明 getBean()
* applicationContext.getBean(xxx.class); —— 装配 xxx 或其主实现类
* applicationContext.getBean( "alphaHibernate", AlphaDao.class); —— 装配 xxx 的实现类Bean 名为 alphaHibernate
*/
// applicationContext 是 Spring 容器的实例化对象
@Test
public void testApplicationContext() {
System.out.println(applicationContext);
AlphaDao alphaDao = applicationContext.getBean(AlphaDao.class);
System.out.println(alphaDao.select());
// alphaDao = applicationContext.getBean( name: "alphaHibernate", AlphaDao.class); // 视频里是这样写的 但我下面这样也成功
alphaDao = applicationContext.getBean( "alphaHibernate", AlphaDao.class);
System.out.println(alphaDao.select());
}
Spring 容器 管理 自定义 Bean 的构造和销毁
被 Spring 容器 管理的 Bean 默认是 单例的
@Scope("Singloten")
修改其单例属性只需要在 class 定义前加
@Scope("prototype")
注解
// 自定义 Bean —— AlphaService
/**
* 注解说明 —— 类
* @Service —— 该类是 业务组件
* @Scope("prototype") —— 修改 类Spring 容器管理 使其不是 单例类
*/
/**
* 注解说明 —— 方法
* @PostConstruct —— 该方法 在构造函数后 调用
* @PreDestroy —— 该方法 在销毁对象前 调用
*/
@Service // 业务组件用这个 注解
//@Scope("prototype") // 让 Bean 不是单例
public class AlphaService {
// 构造函数
public AlphaService() {
System.out.println("实例化AlphaService");;
}
@PostConstruct // 在 构造之后调用 此初始化方法
public void init() {
System.out.println("初始化AlphaService");
}
@PreDestroy
public void destory() {
System.out.println("销毁AlphaService");
}
}
// Test 测试类 ... 省略类 定义 直接给出 测试方法
/**
* 测试说明 如果没有 指定 @Scope("prototype") 则 下述写出的两个 对象构造过程 实际上只会执行一次对象构造 —— 单例效果。
* 依次输出 实例化AlphaService —— 初始化AlphaService —— 销毁AlphaService
*/
@Test
public void testBeanManagement() {
AlphaService alphaService = applicationContext.getBean(AlphaService.class);
System.out.println(alphaService);
alphaService = applicationContext.getBean(AlphaService.class);
System.out.println(alphaService);
}
Spring 容器中装配第三方 Bean
应用场景 在 项目中引用 第三方库 的 Bean
// 定义 配置 类 AlphaConfig 导入 第三方库中的 Bean —— 这里用 java 的 SimpleDateFormat
/**
* 注解说明
* @Configuration —— 这是一个普通的配置类 基于 Component 实现
* @Bean —— 装配 第三方 Bean 或 自定义 Bean
*/
@Configuration // 表示 配置类
public class AlphaConfig {
// 导入 官方Bean SimpleDateFormat
@Bean
public SimpleDateFormat simpleDateFormat() { // Bean 名就是 这个方法名
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 这是一个 官方的 Bean
}
}
// Test 测试类 ... 省略类 定义 直接给出 测试方法
@Test
public void testBeanConfig() {
SimpleDateFormat simpleDateFormat =
applicationContext.getBean(SimpleDateFormat.class);
System.out.println(simpleDateFormat.format(new Date()));
}
使用 依赖注入 直接获取 Bean 的方式 —— 推荐
// Test 测试类 ... 省略类 定义 直接给出 主要内容 及 测试方法
/**
* 注解说明
* @Autowired —— 直接 声明 Bean 对象 将其注入到 Spring 容器中
* @@Qualifier("alphaHibernate") —— 如果 Bean 有多个实现类 通过参数传递 指定实现类
*/
@Autowired // 使用 依赖注入 直接 获取 Bean 不需要上述 的 操作
@Qualifier("alphaHibernate") // 指定 实现类
private AlphaDao alphaDao;
@Autowired
private AlphaService alphaService;
@Autowired
private SimpleDateFormat simpleDateFormat;
@Test
public void testDI() {
System.out.println(alphaDao);
System.out.println(alphaService);
System.out.println(simpleDateFormat);
}
controller 调用 service service 调用 dao —— 依赖注入的综合示例
controller —— 定义请求接口 调用 service
service —— 业务实现层 调用 dao
dao —— 数据处理层 调用数据库
// 模拟一个上述 接口请求 到 返回数据 的过程 返回一个 String 模拟数据库数据
// 调用
// 浏览器地址栏输入 localhost:8080/alpha/data
/**
* controller.AlphaController
* 注解说明
* @Controller —— 这是一个 接口定义类
* @RequestMapping("url_path") —— 请求的 url
* @ResponseBody —— 实际请求的 执行方法
*/
@Controller
@RequestMapping("/alpha")
public class AlphaController {
@Autowired
private AlphaService alphaService;
@RequestMapping("/data")
@ResponseBody
public String getData() {
return alphaService.find();
}
}
/**
* service.AlphaService
*/
@Service
public class AlphaService {
// ...
@Autowired
private AlphaDao alphaDao;
public String find() {
return alphaDao.select();
}
}
/**
* dao.AlphaDao —— interface
* 两个 implements class : AlphaDaoHibernateImpl (name: alphaHibernate) —— 省略不在这里列出
* AlphaDaoMyBatisImpl (@Primary)
*/
public interface AlphaDao {
String select();
}
@Repository
@Primary
public class AlphaDaoMyBatisImpl implements AlphaDao {
@Override
public String select() {
return "MybatisImpl";
}
}
/**
* main
*/
@SpringBootApplication // 自动配置 并生成 spring 容器 不需要手动生成
public class CommunityApplication {
public static void main(String[] args) {
SpringApplication.run(CommunityApplication.class, args);
}
}