2021.5.18-IoC理解以及Spring基于XML的实现

一.IoC概念

在最初学习的时候,我们通过new的方式创建一个对象



@Test
public void test(){
    UserService service = new UserServiceImpl();
    service.getUser();
}

在这个过程中,我们是主动的,我们程序员需要用程序去管理对象的创建。这样一来,程序的耦合性就会很高,每次改动代码需要的代价就越昂贵。

但是,如果我们进行一下改变,

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    // 利用set实现
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
 
    @Override
    public void getUser() {
        userDao.getUser();
    }
}
//测试类
@Test
public void test(){
    UserServiceImpl service = new UserServiceImpl();
    service.setUserDao( new UserDaoMySqlImpl() );
    service.getUser();
    //那我们现在又想用Oracle去实现呢
    service.setUserDao( new UserDaoOracleImpl() );
    service.getUser();
}

利用set的这种方式,在我们需要对象的时候,直接向工厂索要,让工厂为我们创建查找。这样,我们的程序是被动的,主动权给了使用者,程序不需要再去管理对象的创建,降低耦合性

这种被动接受资源的方式获取对象的思想就是控制反转控制反转IoC(Inversion of Control),是一种设计思想,**DI(依赖注入)**是实现IoC的一种方法 。 IoC是Spring框架的核心内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3t7oOox-1621415494619)(C:\Users\DELL\Desktop\重要文档\笔记\Java\JavaSpring\img\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy91SkRBVUtyR0M3S3REaWFPcUZ5NW91cmxKOEZUVlYyRkZ1WWlibWF2bEJIcTllNGNEcWljbHBZU0c4VlQ0RWljVnNucUtwNjV5SktRZU5pYnNWZFRpYWhRaWJKU2cvNjQw.png)]

在没有IoC的程序中,对象的创建与对象间的依赖关系都编码在程序中,对象的创建由程序控制

在IoC的程序中,对象的创建转移给第三方,程序不再管理对象的创建,只需要调用即可。从而解决程序的耦合

二. IoC的实现方式
  1. 使用XML配置

    Bean的定义信息是和实现分离的

  2. 使用注解配置

  3. 新版本Spring零配置实现IoC

    即 Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象

三. Spring基于XML实现IoC
Bean的配置
<?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/spring-beans.xsd">
 
    <!--bean就是java对象 , 由Spring创建和管理-->
    <bean id="hello" class="com.kuang.pojo.Hello">
        <property name="name" value="Spring"/>
    </bean>
</beans>

beans标签:用于配置Sprin 创建对象,并且存入 ioc 容器之中

id属性:对象的唯一标识,相当于对象名

class属性:指定要创建对象的全称类名,默认情况下调用无参构造参数。

name:别名,并且可以同时取多个别名

scope属性:指定对象的作用范围

	- singleton:默认值,单例
	- prototype:多例
	- request:WEB项目中,Spring创建的一个Bean对象,将对象存在request域中。 
	- session:WEB项目中,Spring创建的一个Bean对象,将对象存在session域中。 
	-  global session:WEB项目中,应用在Protlet环境,如果没有Protlet环境那么globalSession相当于session。作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session。 

init-method:指定类中的初始化方法名称

destroy-method:指定类中销毁方法的名称

创建Bean的三种方式

第一种:使用默认的五参数构造函数

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

在上下文环境获取之后,对象已经通过无参数构造创建好了

在spring的配配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签。
采用的就是默认的构造函数创建bean对象,此时如果类中没有默认的构造函数,则无法创建对象。

第二种:通过有参构造方法来创建

<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <!-- index指构造方法 , 下标从0开始 -->
    <constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <!-- name指参数名 -->
    <constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
    <constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>
别名
<!--设置别名:在获取Bean的时候可以使用别名获取-->
<alias name="userT" alias="userNew"/>
import

一般用于团队开发,将多个不一样的Bean文件导入

<import resource="{path}/beans.xml"/>

的时候可以使用别名获取–>


##### import

一般用于团队开发,将多个不一样的Bean文件导入

```java
<import resource="{path}/beans.xml"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值