spring框架---IOC

spring框架的概述

spring是轻量级的开源的JavaEE框架

解决企业应用的开发复杂性

spring有两个核心 IOC AOP

​ IOC:控制反转,把创建对象的过程交给Spring进行管理

​ AOP:面向切面,不修改源代码的进行功能增强

Spring 先关特点:1.方便解耦 简化开发 2.Aop编程支持 3.方便程序的测试 4。方便集成各种框架

​ 5.方便进行事务的操作

​ 6. 降低Api的开发难度

IOC

1.什么是IOC:

(1)控制反转,把对象的创建和对象调用的过程交给spring的过程

(2)目的:为了耦合度降低

(3)入门案例 IOC实现

2.底层原理

(1)xml解析,工厂模式,反射

3、画图详解

请添加图片描述

​ 读取配置文件,通过反射去创建对象,本质上是一个对象工厂模式, 进一步降低耦合度

接口(BeanFactory)

IOC思想基于IOC容器完成,底层就像对象工厂

Spring提供IOC实现的两种方式,

(1)BeanFactory 是spring里面内部的使用接口,不提供开发人员使用

特点:加载配置文件时不会去创建里面的对象,只能在获取或者使用的时候才会去创建这个对象

(2) ApplicationContext BeanFactory接口的子接口,提供更多强大的功能,一般由开发人员使用

加载配置文件的时候,就会把你在配置文件的对象进行创建。

(3)ApplicationContext接口有实现类

ClassPathXmlApplicationContext src下的文件

FileSystemXmlApplicationContext 盘符下的内容

具体操作:操作Bean管理

1.什么是Bean管理:

两个操作(1)Spring床架对象(2)注入属性

2.Bean管理操作的两种方式实现

基于xml配置文件实现,

创建对象

<bean id="user" class="com.atguigu.spring.User"></bean>
在spring文件中使用bean标签,标签里面添加对应属性,便可以实现
在bean标签中的属性:
id属性:获取对象时的唯一标识
class属性:创建对象时类的全路径
name属性:作用和id一样  区别:id中不可以加特殊符号,早期属性给strut1提供
创建对象时,默认也是创建无参数构造方法

注入属性

(1)DI:依赖注入,就是注入属性

第一种使用set方法的注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3O9POmq-1626936633689)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210720205355136.png)]

先创建类,定义属性,然后给出set方法

在spring配置文件中配置对象创建,配置属性注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVH8QDb0-1626936633691)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210720205346147.png)]

第二种注入方式:使用有参数的构造进行注入

1.先创建类和属性,之后构建有参数构造器

2.在xml配置文件中配置bean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aeH2RaF4-1626936633693)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210720211042016.png)]

了解:p名称空间注入

简化xml配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oSKCQKJy-1626936633694)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210720211809516.png)]

xml注入其他类型方式

1.字面量 (1)null值

(2)属性值包含特殊符号

例如value=“<<南京>>" 此时不能通过编译 解决

把<>进行转义&lt:&gt;

把带特殊符号内容写到CDATA

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMiCl0CT-1626936633695)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210720213140119.png)]

基于属性----外部bean

!创建两个类service类和dao类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfCG4ADh-1626936633696)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721102059896.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bbRHFBbI-1626936633696)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721102115813.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xje4J8Sj-1626936633697)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721102125274.png)]

!在service层调用dao层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBTntHRN-1626936633697)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721102144251.png)]

!在spring配置文件中去配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVEjlCCa-1626936633698)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721102158061.png)]

注入属性----内部bean和级联赋值

内部bean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqOg6SOV-1626936633698)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721112617438.png)]

级联赋值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPn8RUq8-1626936633698)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721153658137.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqHEHTqZ-1626936633699)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721154152923.png)]

Ioc操作Bean管理(xml注入集合属性)

1.注入数组类型属性

2.注入List集合类型属性

3.注入Map集合类型属性‘

<bean id="ept" class="com.atguigu.spring.Ept">
    <property name="age" value="jie"></property>
    <property name="name" value="zhang"></property>
    <property name="dev" ref="dev"></property>
    <property name="dev.ename" value="xuan"></property>
</bean>
    <bean id="dev" class="com.atguigu.spring.Dev">
    </bean>

    <bean id="shuzu" class="com.atguigu.spring.Shuzu">
        <property name="cource">
            <array>
                <value>计算机网络</value>
                <value>数据结构</value>
            </array>

        </property>
        <property name="list">
            <list>
                <value>asd</value>
                <value>qwe</value>
            </list>

        </property>
        <property name="map">
           <map>
               <entry key="Java" value="java"></entry>
               <entry key="C" value="c"></entry>
           </map>
        </property>
        <property name="set">
            <set>
                <value>sad</value>
                <value>sadffg</value>

            </set>
        </property>



    </bean>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nfq8wclc-1626936633699)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721184730149.png)]

4.在集合中里面设置对象类型值

<!--创建多个 course 对象-->

<bean id= "course1" class= "com.atguigu.spring5.collectiontype.Course">

 <property name="cname" value= "Spring5 框架"></property>

</bean> 

<bean id="course2" class="com.atguigu.spring5.collectiontype.Course">

 <property name="cname" value="MyBatis 框架"></property>

</bean>

<property name="courseList">

 <list>

 <ref bean="course1"></ref>

 <ref bean="course2"></ref>

 </list>

</property> 

5.把集合注入部分提取出来

(1)在 spring 配置文件中引入名称空间 util

*<?*xml version="1.0" encoding="UTF-8"*?>*

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:p="http://www.springframework.org/schema/p"

 xmlns:util="http://www.springframework.org/schema/util"

 xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans.xsd

 http://www.springframework.org/schema/util 

http://www.springframework.org/schema/util/spring-util.xsd"> 

(2)使用 util 标签完成 list 集合注入提取

*<!--1 提取 list 集合类型属性注入-->* 

<**util****:list** **id=****"bookList"**>

<**value**>易筋经</**value**>

 <**value**>九阴真经</**value**>

 <**value**>九阳神功</**value**>

</**util****:list**>

*<!--2 提取 list 集合类型属性注入使用-->* 

<**bean** **id=****"book"** **class=****"com.atguigu.spring5.collectiontype.Book"**>

 <**property** **name=****"list"** **ref=****"bookList"**></**property**>

</**bean**>
FactoryBean

Spring有两种类型的bean,一种是普通bean,一种是工厂bean

普通bean:在配置文件中定义的类型就是你的返回类型

工厂bean:在配置文件中定义bean的类型可以使不一样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buofQXtW-1626936633700)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721192752825.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zp4CGE3S-1626936633700)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721192807730.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tkz5Zz8e-1626936633700)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721192800419.png)]

Bean的作用域

在sprin里面,设置bean实例,是单实例,还是多实例

默认情况下是单实例

如何设置是单实例还是多实例,属性scope可以设置

​ 第一个值,默认值:singleton,表示单实例对象

​ 第二个值, prototype ,表示多个实例对象

singleton和prototype区别

表示单实例和多实例的区别

设置 singleton的时候 ,加载spring配置文件时就会创建单实例对象

设置prototype值时,不是在加载spring配置文件时候创建对象,是在调用getBean方法时创建多实例对象

request

session

Bean的生命周期

1.生命周期

!从对象的创建到对象销毁的过程

2.bean生命周期

!通过构造器创建bean实例(无参数构造)

1为bean属性设置和对其他bean的引用(调用set方法)

​ !把bean实例传递bean后置处理器的方法

!调用bean初始化的方法(需要进行配置)

​ !把bean实例传递bean后置处理器的方法

!bean可以使用(对象获取到了)

!当容器关闭时,调用bean的销毁方法(需要进行配置销毁的方法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDQwJmqX-1626936633701)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721230144953.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuBa46PF-1626936633701)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721230220866.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJMnBbPc-1626936633702)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721230233668.png)]

引入外部属性文件配置数据库连接池

(1)创建外部属性文件,properties 格式文件,写数据库信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sV31oEiD-1626936633702)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721233701922.png)]

(2)把外部 properties 属性文件引入到 spring 配置文件中

⚫ 在 spring 配置文件使用标签引入外部属性文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udYEn4cl-1626936633702)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210721233815723.png)]

基于注解方式

什么是注解

!注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)

!使用注解,作用在类的上面,方法上面,属性上面

!目的:简化xml配置

2.spring针对Bean管理中创建对象提供注解()

(1)@Component

(2)@Service

(3)@Controller

(4)@Repository

*上面的功能一样,都可以用来创建bean实例

3.基于注解方式实现对象创建

第一步:引入aop的依赖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9E8qYID2-1626936633703)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722104944855.png)]

第二步:开启组件的扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRCdvNae-1626936633704)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722105005976.png)]

第三步:创建类,在类上加入注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z5PXvPio-1626936633704)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722105027592.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDvg6Sns-1626936633704)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722105039877.png)]

4.其他组件配置

//表示关闭自动扫描,自定义要扫描Controller类型

<context:component-scan base-package=“com.atguigu.springmvc” use-default-filters=“false”>
<context:include-filter type=“annotation”
expression=“org.springframework.stereotype.Controller”/>
</context:component-scan>

//表示哪些内容不进行扫描

<context:component-scan base-package=“com.atguigu.springmvc”>
<context:exclude-filter type=“annotation”
expression=“org.springframework.stereotype.Controller”/>
</context:component-scan>

5.基于注解方式实现属性的注入(针对对象类型)

@AutoWired :根据属性类型进行自动装配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnqu1jIi-1626936633705)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722112121571.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LFLvWY5y-1626936633705)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722112135296.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8o1LIcZl-1626936633705)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722112145580.png)]

@Qualifier:根据属性名称进行注入

要和Qualifier注解的使用,要和@Autowired一起使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WJ6k7U60-1626936633706)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722142350344.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M77OyeKR-1626936633706)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722142403216.png)]

@Resource:可以根据类型注入,可根据名称注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMx7Tu7k-1626936633707)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722143511326.png)]

!@Value 根据普通类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zqn5t9Yx-1626936633707)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722143605355.png)]

6.完全注解开发

!创建配置类,替代xml配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pIiFr0Ig-1626936633707)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722144919887.png)]

!编写测试类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypmSWtk4-1626936633708)(C:\Users\86155\AppData\Roaming\Typora\typora-user-images\image-20210722144908520.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-IOCSpring框架的核心部分之一,它是一种设计模式,全称为Inversion of Control(控制反转)。它通过将对象的创建、依赖关系的管理和对象的生命周期交给Spring容器来实现,从而降低了组件之间的耦合度,提高了代码的可重用性和可维护性。Spring-IOC的实现主要依靠Spring容器,Spring容器是Spring框架的核心,它负责创建、管理和装配Bean对象,其中Bean是Spring框架中最基本的组件。 Spring-IOC的实现主要有两种方式:BeanFactory和ApplicationContext。其中,BeanFactory是Spring-IOC的基本实现,而ApplicationContext是BeanFactory的子接口,提供了更多高级特性。ApplicationContext是Spring框架中最常用的IOC容器,它除了提供BeanFactory的所有功能外,还提供了更多的企业级特性,例如AOP、事务管理、国际化、事件传播等。 下面是一个简单的Spring-IOC的例子,假设我们有一个UserService接口和一个UserServiceImpl实现类,我们可以通过Spring-IOC容器来创建和管理UserServiceImpl对象: 1.定义UserService接口和UserServiceImpl实现类 ```java public interface UserService { void addUser(User user); } @Service public class UserServiceImpl implements UserService { @Override public void addUser(User user) { // 添加用户的具体实现 } } ``` 2.在Spring配置文件中配置UserService实例 ```xml <bean id="userService" class="com.example.service.UserServiceImpl"/> ``` 3.在代码中获取UserService实例并使用 ```java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = context.getBean("userService", UserService.class); User user = new User(); userService.addUser(user); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值