- 1. 基本介绍
- 2. 得到Spring Ioc容器
- 3. bean管理:初始化及销毁
- 4. 管理第三方bean
- 5. 简化方法:自动装配 @Autowired
- 6. 实际应用
public static void main(String[] args) {
SpringApplication.run(CommunityApplication.class, args);
}
上述的方法除了开启TomCat,自动创建了Spring容器,会自动扫描某些包下某些bean。
会扫描配置类所在包和子包带有注解的内容,一共有四个注解()
在测试代码中启用配置类
@ContextConfiguration(classes = CommunityApplication.class)2. 得到Spring Ioc容器
实现接口 ApplicationContextAware
重写方法 setApplicationContext
把容器暂存为 applicationContext
当程序启动之后,applicationContext 就会被传进来自动进行记录
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
在测试方法中使用容器
@Test //从容器获取bean
public void testApplicationContext() {
System.out.println(applicationContext);
//通过接口名(类名)得到bean,@Primary 优先级高先被获取
AlphDao alphDao = applicationContext.getBean(AlphDao.class);
System.out.println(alphDao.select());
//通过名字得到bean,并转成AlphDAO类型
AlphDao alphDao1 = applicationContext.getBean("alphaHibernate", AlphDao.class);
System.out.println(alphDao1.select());
}
java.dao 包中内容
package com.psynowcoder.community.community.dao;
public interface AlphDao {
String select() ;
}
package com.psynowcoder.community.community.dao;
import org.springframework.stereotype.Repository;
@Repository("alphaHibernate") //给bean一个名字
public class AlphaDaoHibernateImpl implements AlphDao{
@Override
public String select() {
return "Hibernate";
}
}
package com.psynowcoder.community.community.dao;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Repository //开启扫描
@Primary //优先装配
public class AlphaDaoMyBatisImp implements AlphDao{
@Override
public String select() {
return "MyBatis";
}
}
3. bean管理:初始化及销毁
@Test // 管理bean,初始化及销毁
public void testBeanManagement() {
AlphService alphService = applicationContext.getBean(AlphService.class);
System.out.println(alphService);
//被Spring容器管理的bean默认是单个实例,只初始化一次,销毁一次
//将调用bean的注解@Scope("prototype")之后变成原型模式,每次重新创建。但是不经常这么做
alphService = applicationContext.getBean(AlphService.class);
System.out.println(alphService);
}
java,service 包中内容
package com.psynowcoder.community.community.service;
import com.psynowcoder.community.community.dao.AlphDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Service // 开启扫描
//@Scope("prototype")
public class AlphService {
public AlphService() {
System.out.println("实例化AlphService");
}
@PostConstruct //在构造器之后调用
public void init() {
System.out.println("初始化AlphService");
}
@PreDestroy //销毁之前调用
public void destroy() {
System.out.println("销毁AlphService");
}
}
4. 管理第三方bean
方法:写配置类,进行注解和声明
@Test // 通过配置配管理外部bean
public void testBeanConfig() {
SimpleDateFormat simpleDateFormat =
applicationContext.getBean(SimpleDateFormat.class);
System.out.println(simpleDateFormat.format(new Date()));
}
java.config 配置类
package com.psynowcoder.community.community.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
@Configuration
public class AlphConfig {
@Bean //方法名就是bean的名字
public SimpleDateFormat simpleDateFormat() {
//这个方法返回的对象将被装配到容器里
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
5. 简化方法:自动装配 @Autowired
@Autowired //自动装配
@Qualifier("alphaHibernate")//指定bean注入
private AlphDao alphDao;
@Autowired
private AlphService alphService;
@Test // 测试依赖注入
public void testDI() {
System.out.println(alphDao);
System.out.println(alphService);
}
完整测试类如下:
package com.psynowcoder.community.community;
import com.psynowcoder.community.community.dao.AlphDao;
import com.psynowcoder.community.community.service.AlphService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
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 = CommunityApplication.class)
class CommunityApplicationTests implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Test //从容器获取bean
public void testApplicationContext() {
System.out.println(applicationContext);
//通过接口名(类名)得到bean,@Primary 优先级高先被获取
AlphDao alphDao = applicationContext.getBean(AlphDao.class);
System.out.println(alphDao.select());
//通过名字得到bean,并转成AlphDAO类型
AlphDao alphDao1 = applicationContext.getBean("alphaHibernate", AlphDao.class);
System.out.println(alphDao1.select());
}
@Test // 管理bean,初始化及销毁
public void testBeanManagement() {
AlphService alphService = applicationContext.getBean(AlphService.class);
System.out.println(alphService);
//被Spring容器管理的bean默认是单个实例,只初始化一次,销毁一次
//将调用bean的注解@Scope("prototype")之后变成原型模式,每次重新创建。但是不经常这么做
alphService = applicationContext.getBean(AlphService.class);
System.out.println(alphService);
}
@Test // 通过配置配管理外部bean
public void testBeanConfig() {
SimpleDateFormat simpleDateFormat =
applicationContext.getBean(SimpleDateFormat.class);
System.out.println(simpleDateFormat.format(new Date()));
}
@Autowired //自动装配
@Qualifier("alphaHibernate")//指定bean注入
private AlphDao alphDao;
@Autowired
private AlphService alphService;
@Test // 测试依赖注入
public void testDI() {
System.out.println(alphDao);
System.out.println(alphService);
}
}
6. 实际应用
controller处理浏览器请求——调用业务组件service——调用dao访问数据库
在 AlphService 中自动装配 alphDao,调用 select方法
package com.psynowcoder.community.community.service;
import com.psynowcoder.community.community.dao.AlphDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Service
//@Scope("prototype")
public class AlphService {
@Autowired // 自动装配,service依赖于dao
private AlphDao alphDao;
public AlphService() {
System.out.println("实例化AlphService");
}
@PostConstruct //在构造器之后调用
public void init() {
System.out.println("初始化AlphService");
}
@PreDestroy //销毁之前调用
public void destroy() {
System.out.println("销毁AlphService");
}
public String find() {
return alphDao.select();
}
}
同理 controller 调用 service
package com.psynowcoder.community.community.controller;
import com.psynowcoder.community.community.service.AlphService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/alpha")
public class AlphaController {
@Autowired
private AlphService alphService;
@RequestMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello Spring Boot.";
}
@RequestMapping("/data")//浏览器访问前提
@ResponseBody
public String getData() {
return alphService.find();
}
}
启动整个项目,访问指定页面



