1、控制反转、依赖注入
1.1什么是控制反转
控制反转是面向对象编程中使用的术语,通过该术语,对象或对象集的控制权被赋予框架或由框架提供的容器。
控制反转IoC:
给予spring实现了一个bean的仓库,将项目中的类的对象纳入到spring中管理,管理其生命周期 这样就解决多次实例化对象问题,减少了内存的消耗
可以理解为;原来主动权在代码(程序员),何时需要,何时获取,被动方就是仓库,容器
IoC之后控制权在于仓库,程序(开发者)变成了被动的
1.2什么是依赖注入
* 依赖:类依赖于属性(HelloController)依赖(HelloService)
* 注入:(用到了反射的知识),需要使用注解标注 @Autowired
public class HelloController {
//如果从容器中取数据,耦合性非常强
HelloService hs=new HelloService();
}
但是一个问题就出现了,HelloController 与HelloService之间的耦合非常紧密,假如我们还没有来的及对HelloController 的HelloService绑定对象,却调用了show方法的话,那么程序将会抛出空指针异常。
这是我们开发过程中最不希望看到的结果,所以Spring提供了一套叫做控制反转与依赖注入这套机制,目的就是为了解耦。
在Spring中,你不需要自己创建对象,你只需要告诉Spring,哪些类我需要创建出对象,然后在启动项目的时候Spring就会自动帮你创建出该对象,并且只存在一个类的实例。这个类的实例在Spring中被称为Bean。而这种模式,我们称之为“单例模式”。也就是一个类只有一个实例的意思。
JAVA注解配置:
声明注解的语法:
声明 含义
@Component 当前类是组件,没有明确的意思
@Service 当前类在业务逻辑层使用
@Repositorty 当前类在数据访问层使用
@Controller 当前类在展现层(MVC)使用
以上四种声明方式效果完全一致,使用不同的关键词是为了给阅读的人能够快速了解该类属于哪一层
@Controller // 标注他是个controller类
//这是在告诉Spring,在创建项目时要自动帮忙创建这个类的Bean
public class HelloController {
//耦合型非常高 关联性
@Autowired //要求Spring帮我们注入一个Bean
HelloService hs;
@RequestMapping("hello")
@ResponseBody
/*默认情况下Spring会将返回值当作路径解析为文本 需要注解 将指定的方法直接写入到回应对象中 */
hs.test();
return "helloWorld";
}
但是还没完,我们虽然让Spring帮我们创建了对象,但是HelloController 怎么知道这个对象在哪呢?它根本就不知道你有这么一个Bean(对象)啊。
所以接下来,我们要告诉HelloController 刚才Spring帮我们创建的Bean(对象)到底在哪,也就是“注入”这个Bean。
注入注解的语法:
声明 含义
@Autowired Spring为这个变量注入一个Bean
@Inject 翻译为“注入”最易懂的注入注解
@Resource 翻译为“资源”,可以理解为Spring往里面注入的时一个资源
以上四种声明方式效果完全一致,使用不同的关键词是为了给阅读的人能够快速了解注入的Bean到底是个什么东西。
使用方法为:在我们需要注入依赖的成员变量前使用该注解。让我们看下面一段代码
我们可以看到,在声明成员变量Student的前面我们使用了@Autowired,所以Spring会自动帮我们注入一个Bean,我们就再也不用担心忘记绑定对象而出现空指针啦。
但是这还没完,虽然我们告诉了Spring哪些类是需要添加依赖,哪些类是需要注入Bean,但是Spring还需要我们做一次配置,来真正完成这样一个操作。
1.3松散耦合对象
/* 需要做一个映射 代表访问hello 就访问这个方法*/
@RequestMapping("hello")
@ResponseBody
/*默认情况下Spring会将返回值当作路径解析为文本 需要注解 将指定的方法直接写入到回应对象中 */
2、scope
2.1scope属性
spring中scope是一个非常关键的概念,简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用
scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。
————————————————
版权声明:本文为CSDN博主「LitaVadaski」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LitaVadaski/article/details/79487945