IOC(Inversion of Control)控制反转:对象的创建控制权由程序转移到外部,这种思想称为控制反转。/使用对象时,由主动new产生对象转换为由外部提供对象,此过程种对象创建控制权由程序转移到外部,此思想称为控制反转。/Spring提供了一个容器,称为IoC容器,用来充当Ioc思想中的“外部”。/IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean。
DI(Dependency Injection)依赖注入:在容器中建立bean与bean之间的依赖关系的整个过程,,称为依赖注入。
Spring实现充分解耦:使用IoC容器管理bean+在IoC容器内将有依赖关系的bean进行关系绑定。
实现效果:使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。
在
在<>
通俗地说:看造的对象是单例的还是非单例的。
在
使用FactoryBean实例化bean,想调整单例非单例:
public boolean isSingleton(){
return true; //表示单例
}
Spring帮我们管理的是可以复用的对象,提高我们的效率。
适合交给容器进行管理的bean(可以反复用):表现层对象,业务层对象service,数据层对象dao,工具对象。不适合交给容器进行管理的bean(有状态的,会记录成员变量的属性值):封装实体的域对象。
私有的东西能访问是通过反射。
方法1:通过构造方法来实例化对象
方法2:使用静态工厂创建对象
class配的是工厂类名,还需要添加工厂中真正用来造对象的方法名:
方法3:实例工厂初始化bean
先把工厂对象造出来:
factory-bean写工厂的实例在哪,factory-method写工厂中的方法名:
方法4:使用FactoryBean实例化bean
public class UserDaoFactoryBean implements FactoryBean{
//代替原始实例工厂中创建对象的方法
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
@Override
public Class> getObjectType() {
return UserDao.class;
}
}
bean生命周期:bean从创建到消亡的完整过程
在
想要调用销毁方法还要调用容器close方法(更加暴力),也可以调用registerShutdownHook方法。
在ServiceImpl类中可以,继承InitializingBean和DisposableBean
管理什么?(Service与Dao)
如何将被管理的对象告知IoC容器?(配置)
被管理的对象交给IoC容器,如何获取到IoC容器?(接口)
IoC容器得到后,如何从容器中获取bean?(接口方法)
使用Spring导入哪些坐标?(pom.xml)
第1步:导入Spring坐标,记得刷新Maven如下:
org.springframework
spring-context
5.2.10.RELEASE
第2步:定义Spring管理的类(接口)
BookService如下:
public interface BookService {
public void save();
}
BookServiceImpl如下:
public class BookServiceImpl implements BookService{
private BookDao bookDao = new BookDaoImpl();
public void save(){
bookDao.save();
}
}
第3步:创建Spring配置文件,配置对应类作为Spring管理的bean
点击resources然后New-XML Configuration File-Spring Config
新建的.xml文件名为:applicationContext.xml
写入:
第4步:初始化IoC容器(Spring核心容器/Spring容器),通过容器获取bean
右键java-New-Java Class,创建一个名为App的文件
public class App {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
BookDao bookDao = (BookDao)ctx.getBean("bookDao");
bookDao.save();
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}
第1步:删除使用new的形式创建对象的代码+第2步:提供依赖对象对应的setter方法
public class BookServiceImpl implements BookService{
//5.删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save(){
bookDao.save();
}
//6.提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
第3步:配置service与dao之间的关系