Spring IOC

学习目标:

掌握Spring

学习内容:

1、 IOC 2、 Spring Bean管理 3、 xml配置方式实现 4、 注解方式实现

学习时间:

2021年11月8日

学习产出:

1、 技术笔记 1 遍 2、CSDN 技术博客 1 篇

IOC(控制反转)

Inverse of Control 读成反转控制更容易理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给了spring框架来管理。

IOC容器是具有依赖注入功能的容器,负责对象的实例化、对象的初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等操作,对象的整个生命周期都是由容器来控制。我们需要使用的对象都由IOC容器进行管理,不需要我们再去手动通过new的方式去创建对象,由IOC容器直接帮我们组装好,当我们需要使用的时候直接从IOC容器中直接获取就可以了。

正控

​ 若要使用某个对象,需要自己去负责对象的创建

反控

​ 若要使用某个对象,只需要从spring容器中获取需要使用的对象,不关心对象创建的过程,把创建对象的控制权反转给spring框架。

IOC目的

​ 降低耦合度

底层实现方式

​ 解析xml/扫描注解标签 + 工厂模式 + 反射机制

Spring Bean管理

这也是springIOC思想的体现

基于xml配置方式

bean 配置化需要spring管理的类

​ id 生成的对象名

​ class 全类名

​ name 对象别名,可以为多个

​ scope:

​ singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.

​ prototype:原型 getBean()的时候都会 new Bean()

​ request:每次 http 请求都会创建一个 bean, 仅用于 WebApplicationContext 环境

​ session:同一个 http session 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上

<!--配置我们项目中的类,配置类之后Spring就会对对象进行对象的存储管理(生成对象存储)
        由Spring框架生成的对象称之为一个bean,特指Spring框架创建的对象,会给一定特殊功能

        id:生成对象的表示
        class:类的地址(全类名)
        name:对象别名,通过name也可以获取对象
        scope:范围,作用域
                singleton:单例的,整个应用程序中只创建一次,多次获取是同一个,在Spring容器启动时就创建
                prototype:原型的(多例的) 每次获取时,会创建一个新的对象 -->

    <bean id="user" name="user1,user2" class="com.ffyc.spring.model.User" scope="prototype"></bean>

xml配置方式依赖注入

DI:Dependency Injection(xml配置方式依赖注入)

指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。

实现IOC需要DI注入

有两种注入方式

​ 1、构造方法注入

​ 2、set方法注入

构造方法注入

使用较少

		<!--通过属性名注入值-->
	<bean id="user" class="com.ffyc.spring.model.User">
		<constructor-arg name="name" value="张三"></constructor-arg>
        <constructor-arg name="age" value="20"></constructor-arg>
    </bean>
		<!--通过属性的类型注入值-->
    <bean id="user" class="com.ffyc.spring.model.User">
         <constructor-arg type="java.lang.String" value="张三"></constructor-arg>
         <constructor-arg type="java.lang.Integer" value="22"></constructor-arg>
    </bean>

set方法注入

		<bean id="user" class="com.ffyc.spring.model.User">
       		<property name="name" value="李四"></property>
       		<property name="age" value="21"></property>
        	<property name="list">
                <list>
                     <value>1</value>
                     <value>2</value>
                     <value>3</value>
                </list>
            </property>
        </bean>

		<!--  spring管理了UserDao UserService-->
        <bean id="userDao" class="com.ffyc.spring.dao.UserDao"></bean>
        <bean id="userService" class="com.ffyc.spring.service.UserService">
            <property name="userDao" ref="userDao"></property>
        </bean>

注解方式实现

注解开发准备工作:

导入注解需要的jar包

注解需要的jar包封装在spring aop jar 包中

开启注解扫描

在spring的配置文件中开始注解扫描

	<!--
      开启spring注解扫描
    -->
    <context:component-scan base-package="com.ffyc.spring"></context:component-scan>

注解创建对象

@Component

@Service

@Repository

以上注解都可以实现创建对象的功能,知识为了后续扩展功能,在不同的层使用不同的注解标记

创建原型或者单例

​ @Scope(value = “prototype”) 原型

​ @Scope(value = “singleton”) 单例

@Component(value = "user") //想当于<bean id=“user” class=“”></bean>
@Scope(value = "singleton") //指定生成对象的策略(单例)
public class User 
@Service(value = "userService")
public class UserService
@Repository(value = "userDao")
@Scope(value = "singleton") //指定生成对象的策略(单例)
public class UserDao

注解方式注入属性

@Autowired

@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在, 如果允许 null 值,可以设置它的 required 属性为 false。

byType 自动注入

该注解默认使用按类型自动装配 Bean 的方式

byName 自动注入如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。

需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。

	 	/*
	 	@Autowired  是spring框架自身提供的注解标签
        required = true  这是默认的  注入的时候不能为null值
        是根据属性的类型自动注入(根据属性的类型在spring容器中查找)
        也可以通过对象名查找注入,需要结合@Qualifier(value = "userDao")
        */
        @Autowired(required = false)
        @Qualifier(value = "userDao")
		 UserDao userDao;

JDK 注解@Resource 自动注入

Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入

byName 注入引用类型属性

@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配的 Bean 的 id。

             //指定注入的对象名,不写就根据类型查找
    @Resource(name = "userDao")  //是JDK自身提供的注解标签,也支持byName和byType两种注入方式
    UserDao userDao;

注解与 xml 的对比

注解优点

​ 方便、直观、高效(代码少,没有配置文件的书写那么复杂)

注解缺点

​ 以硬编码的方式写入到java代码中,修改是需要重新编译代码的。

xml优点

​ 配置和代码是分离的,在xml中做修改,无需编译代码,只需要重启服务器即可将新的配置加载。

xml缺点

​ 编写麻烦,效率低,大型项目过于复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值