IoC(Inversion of Control)控制反转,是一种设计原则。一般情况创建一个对象我们都会通过new关键字来操作,而IoC顾名思义由代码(也就是IoC容器)来控制对象的创建。
简单的说:通过使用IoC可以将对象的死活交给容器,由容器负责。
首先需要明确,IoC是一种设计原则,一种思想,通过这种原则设计可以让我们码出松耦合、优良的程序。
Spring IoC容器是一个管理Bean的容器,在Spring的定义中,它要求所有IoC容器都实现BeanFactory接口。
Spring可以通过XML和java配置文件装配Bean,不过SpringBoot推荐使用注解的方式来装配Bean。
一个简单的javabean
public class User {
private String name;
/** setter and getter **/
}
一个用于配置bean信息的类
@Configuration
public class Appconfig {
@Bean(name = "user")
public User initUser(){
User user = new User();
return user;
}
@Bean(name="people")
public People initPeople(){
People people=new People();
return people;
}
}
使用bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(Appconfig.class);
User user =ctx.getBean(User.class);
People people=ctx.getBean(People.class);
创建一个可被扫描的javabean
@Component("people")
public class People {
@Value("1")
private Long id;
@Value("name")
private String Name;
}
配置类
@Configuration
@ComponentScan
public class Appconfig {
}
使用bean
和之前并没有什么区别
ApplicationContext ctx = new AnnotationConfigApplicationContext(Appconfig.class);
User user =ctx.getBean(User.class);
People people=ctx.getBean(People.class);
@Configuration
public class Appconfig {
@Bean(name = "user")
public User initUser(){
User user = new User();
return user;
}
}
通过以上简单使用的Demo不难理解,装配一个Bean其实就是用@Bean注解定义一个返回该类型对象的函数,因此在使用第三方Bean的时候将User换成导入的第三方类即可。
IoC有两种实现方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取相应类型的对象,获得依赖对象的时间也可以在代码中自由控制。
在Springboot中依赖注入主要是基于注解来实现的
创建一个javabean
@Component
public class Test {
public void saySome(){
System.out.println("我是被注入进来的");
}
}
通过@Autowired注解使用该bean
@Autowired
private Test test;
没错就是这么简单,使用@Autowired即可自动注入该bean
在某些情景中,需要自定义初始化或者销毁Bean的过程,来满足Bean特俗初始化和销毁的要求,比如来使用数据库的时候,希望在关闭的时候调用close方法来释放数据库的连接资源。
Bean的生命周期:
方法:在编写bean的时候需要实现特定接口的特定方法,这样spring会自动调用这些方法
比如:BeanNameAware、BeanFactoruAware、ApplicationContextAware、InitializingBea、DisposableBean
初始化和销毁的方法实现
同样是在bean中自定义一个方法 使用上**@PostConstruct 和 @PreDestory**注解
@Postconstruct
public void init(){
}
@PreDestory
public void destory(){
}
Spring有如下集中作用域
类型 | 范围 | 描述 |
---|---|---|
singleton | 所有spring应用 | 默认值 ioc中只存在单例 |
prototype | 所有spring应用 | IoC取出一个bean就创建一个bean |
session | spring web | Http会话 |
application | spring web | web工程生命周期 |
request | spring web | web单次请求 |
globalSession | spring web | 在一个全局的 HTTP Session 中, 一个 Bean 定义对应一个实例 。 实践 中基本不使用 |
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ScopeBean{
}