Web基础之Spring IoC
Spring之IoC
概念
IoC:Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。但实际上依赖注入控制反转的一种表达方式(还有一种叫依赖查找)。什么是控制反转呢,简单来说就是本来上层建筑依赖下层建筑,下载通过依赖注入是下层建筑依附于上层建筑。具体表现就是通过注入的方式,为高级类(接口)添加依赖,注入方式可以为构造方法、set方法和接口注入(用得少,侵入性高)。
而Spring就一种是典型的IoC容器(用来管理bean),并且可以帮助我们管理注入,省去许多麻烦(感觉有点像JVM帮我们管理内存一样)
推荐看一下《Spring揭秘》这本书,讲的非常不错。
快速入门
首先导入IoC相关依赖:
spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
然后是service和dao层的接口及其实现类:
接口及其实现类
public interface UserDao {
public void save();
}
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("保存用户信息");
}
}
public interface UserService {
public void register();
}
public class UserServiceImpl implements UserService {
@Override
public void register() {
System.out.println("注册");
}
}
再然后是xml配置:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/">
<!--
定义bean
id:唯一标识符
class:bean所对应的类
-->
<bean id="userService" class="com.bilibili.service.impl.UserServiceImpl"></bean>
<bean id="userDao" class="com.bilibili.dao.impl.UserDaoImpl"></bean>
</beans>
通过spring工厂获取定义的JavaBean:
//加载配置文件,获取spring工厂,从容器中获取dao和service的实现类
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取service
UserService accountService = (UserService) ac.getBean("userService");
System.out.println(accountService);
//从容器中获取dao
UserDao userDao = (UserDao) ac.getBean("userDao");
System.out.println(userDao);
放一张被转烂了的图:
可以看到BeanFactory是工厂的顶层接口,也就是帮助我们管理bean的,ApplicationContext是其子接口。当然,ApplicationContext除了具有BeanFactory的所有功能之外,还有国际化支持。统一资源加载策略、容器内时间发布的特性。同时,两者对于bean的创建时机也不一样,BeanFactory在需要的时候(调用getbean方法)时创建,ApplicationContext会在读取配置之后立即创建。
上面给出了ApplicationContext的使用方法,BeanFactory则不太一样(XmlBeanFactory在3.1之后已过时):
Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory factory = new DefaultListableBeanFactory();
BeanDefinitionReader bdr = new XmlBeanDefinitionReader((BeanDefinitionRegistry) factory);
bdr.loadBeanDefinitions(resource);
ApplicationContext 接口的实现类非的三种实现类:
- ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件,一般使用这种(类根路径为编译后class)
- FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
- AnnotationConfigApplicationContext: 注解实现类。
bean标签
bean标签的属性:
id
:给对象在容器中提供的唯一标识,用于获取对象class
:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。scope
:指定对象的作用范围。
值:singleton
:默认值,单例prototype
:多例
request
:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.session
:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.global session
:WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session.init-method
:指定类中的初始化方法名称(生命周期相关)。destroy-method
:指定类中销毁方法名称(生命周期相关)。
bean的生命周期:
- init-method: 配置bean创建时的初始化方法。
- destory-method:配置bean销毁时的销毁方法。
在ApplicationContext中:
周期 | 单例singleton | 多例prototype |
---|---|---|
对象出生 | 当应用加载,创建容器时,对象就被创建了。 | 当使用对象时,创建新的对象实例(getBean被调用) |
对象存在 | 只要容器在,对象一直活着 | 只要对象在使用中,就一直活着 |
对象死亡 | 当应用卸载,销毁容器时,对象就被销毁了 | 当对象长时间不用时,被java的垃圾回收器回收了 |
创建bean的三种方式:
<!-- 默认无参构造,一般用这种 -->
<bean id="userService" class="com.bilibili.service.impl.UserServiceImpl"></bean>
工厂方式:
//静态工厂
public class BeansFacotory1 {
public static Object getBeans(){
return new UserServiceImpl();
}
}
//示例工厂
public class BeansFacotory2 {
public Object getBeans(){
return new UserServiceImpl();
}
}
配置方式:
<!-- 静态工厂方法创建对象
class:工厂类的全限定名
factory-method:工厂的静态方法
-->
<bean id="userService" class="com.bilibili.utils.BeansFacotory1" factory-method="getBeans"></bean>
<!-- 实例工厂方法创建对象-->
<!-- 首先配置工厂类的实例 -->
<bean id="beansFactory2" class="com.bilibili.utils.BeansFacotory2"></bean>
<!-- factory-bean:配置工厂类实例对象
factory-method:工厂类中用于创建对象的方法
-->
<bean id="userService" factory-bean="beansFactory2" factory-method="getBeans"></bean>
小声BB:工厂都有了还要你spring干啥
依赖注入
面试官:为什么使用spring?
应聘者:因为方便?
面试官:什么?
让spring来管理bean的确方便
最新文章
- [LeetCode] Count The Repetitions 计数重复个数
- springMVC下载FTP上的文件
- 【读书笔记】iOS-GCD-Dispatch Source
- 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性
- MVC中Linq to sql创建数据模型
- error while loading shared libraries: lib******: cannot open shared object file: No such file or directory
- 微信公共服务平台开发(.Net 的实现)8-------处理图片(上传下载发送)
- UVaLive 6628 Grachten (水题,数学)
- 关于IOS开发者账号一点总结
- 开发中遇到的java小知识
- JDBC初步(一)
- JSON小结
- 快速构建C++项目工具Scons,结合Editplus搭建开发环境
- oracle存储过程学习---包的概念
- sphinx全文检索引擎
- HDFS Federation
- 五行Python代码教你用微信来控制电脑摄像头
- python之装饰器初识
- 【读书笔记】iOS-对iOS应用进行模糊测试
- MyBatis 返回insert操作主键
热门文章
- onContextItemSelected 与 onMenuItemSelected 的那些事
- 3 (mysql实战) 事务隔离
- SpringSecurity-权限关联与控制
- JS垂直落体回弹原理
- JS操作网页中的iframe
- Redis调用
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:文本框(Textarea)
- vue配置config ‘./.../.../***/**.vue’路径别名
- Keras入门——(4)长短期记忆网络LSTM(一)