【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);
	}
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring