Spring-IOC_xml


概述

Spring是开源的J2EE应用程序框架
目的是解决企业应用开发的复杂性

Spring有两个核心部分:IOC和Ao
IOC:控制反转,把创建对象过程交给Spring管理
Aop:面向切面,不修改源代码进行功能增强

Spring特点:
方便解耦,简化开发
Aop编程指出
方便程序的测试
方便和其他框架进行整合
方便进行事务的操作
降低API开发

入门案例

1.下载Spring5
https://repo.spring.io/release/org/springframework/spring/5.3.6/

2.导入jar包

2.写一个User类
3.写Spring.xml内创建类对象

<!--配置User类的对象的创建-->
<bean id="user" class="com.yuan.spring5.User"></bean>

4.测试调用配置文件的对象

@Test
public void testAdd(){
    //加载Spring的配置文件
    ApplicationContext context =
            new ClassPathXmlApplicationContext("bean1.xml");
    //获取创建的对象
    User user = context.getBean("user", User.class);
    user.add();
}

IOC容器(IOC底层原理)

概念:把对象创建和对象之间的调用过程,交割Spring进行管理

底层原理:xml解析 - > 工厂模式 - > 反射

<bean id="user" class="com.yuan.spring5.User"></bean>

对上面的xml代码进行dom4j解析出class后面的类路径,然后就可以在工厂类中通过class.forname创建出类路径的类对象,实现对象的调用,这就实现了解耦,以后只需要修改xml内的class属性就可以让对象调用不同的对象,而不需要去修改代码。

IOC(接口)

1.IOC容器底层就是对象工厂
2.Spring提供IOC容器实现两种方式:(两个接口)

(1)BeanFactory:      
        IOC容器基本实现,内部的使用的接口,一般不提供给我们使用
(2)AppliactionContext  
        BeanFactory接口的子接口,提供更多更强大的接口,使用

ApplactionContext是加载配置文件的时候就会把配置文件对象进行创建,饿汉式
BeanFactory是懒汉式
ApplicationContext比较好,一开始就创建所有对象,方便后面调用对象。

AppliactionContext接口的常用实现类

FileSystemXmlApplicationContext(写入盘符的路径)
ClassPathXmlApplicationContext(写入src下的文件路径)

IOC操作bean管理

Bean管理指的是两个操作:Spring创建对象,Spring注入属性
Bean管理操作有两种方式:
基于xml配置文件方式实现
基于注解方式实现

基于xml方式的bean管理

1.创建对象

1<bean id="user" class="com.yuan.spring5.User"></bean>
Bean标签有很多属性:
     Id属性 给对象起一个别名,就像Map中的key标识
     Calss属性 类的全路径:包+类

2.注入属性

(1)DI依赖注入-set和构造器两种方法

set方法

  • 1.创建类,定义属性和set方法
  • 2.配置xml
<!--注入属性-->
<bean id="book" class="com.yuan.spring5.Book">
    <!--使用property完成属性注入-->
    <property name="bname" value="西游记"></property>
    <property name="bauthor" value="罗贯中"></property>
</bean>

构造器方法

  • 1.创建类,定义属性和构造器
  • 2.配置xml
     <!--注入属性通过构造器方法-->
<bean id="book2" class="com.yuan.spring5.Book">
    <constructor-arg name="bname" value="月朗星稀"></constructor-arg>
    <constructor-arg name="bauthor" value="尼玛"></constructor-arg>
</bean>

Xml注入其他类型的属性

<!--设置属性为null值-->
<property name="address">
    <null/>
</property>

<!--设置特殊字符-->
<property name="address" value="&lt;南京&gt;"></property>

(2)注入属性-外部bean

1创建两个类 Service和Dao
2在service内调用Dao类的方法 生成Dao对象和set方法

public class UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void add(){
        System.out.println("service.add>>>>>>");
        userDao.update();
    }
}

3在spring的配置文件中配置 ref关键属性值 传入另一个bean对象的id值

<!--service和dao对象的创建和注入-->
<bean id="userService" class="com.yuan.spring5.service.UserService">
    <!--注入userDao对象-->
    <property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.yuan.spring5.dao.UserDaoImpl"></bean>

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

一对多关系,部门和员工

public class Emp {
    private String ename;private String gender;
    //员工属于某一个部门
    private Dept dept;
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
}

Xml内对bean内加入另一个bean

<!--内部bean-->
<bean id="emp" class="com.yuan.spring5.bean.Emp">
    <property name="ename" value="小豪"></property>
    <property name="gender" value="男"></property>
    <property name="dept">
        <bean id="dept" class="com.yuan.spring5.bean.Dept">
            <property name="dname" value="保安部"></property>
        </bean>
    </property>
</bean>
	

Xml注入集合属性

注入数组类型,Map类型,Set类型的集合类属性
创建属性,生成对应的set方法
配置xml文件

<bean id="stu" class="com.yuan.spring5.Stu">
    <property name="course">
        <!--数组集合注入-->
        <array>
            <value>java课程</value>
            <value>C#课程</value>
        </array>
    </property>

    <!--List集合注入-->
    <property name="list">
        <list>
            <value>sdcs</value>
            <value>cdsc</value>
        </list>
    </property>

    <!--Map集合注入-->
    <property name="maps">
        <map>
            <entry key="1" value="abc"></entry>
            <entry key="2" value="cba"></entry>
        </map>
    </property>

    <!--Set集合注入-->
    <property name="maps2">
        <set>
            <value>1</value>
            <value>2</value>
        </set>
    </property>
</bean>

在集合内放入对象类
设置set方法
在xml文件内创建course对象的bean类,

<bean id="course1" class="com.yuan.spring52.Collection.Course">
    <property name="cname" value="语文"></property>
</bean>
<bean id="course2" class="com.yuan.spring52.Collection.Course">
    <property name="cname" value="数学"></property>
</bean>

然后在stu的bean内设置list属性注入多个course的bean

<!--注入对象数组,引入外部多个bean对象到list集合内-->
<property name="courselist">
    <list>
        <ref bean="course1"></ref>   已经在外部设置好的bean对象
        <ref bean="course2"></ref>   同上
    </list>
</property>

把集合注入部分提取出来
利用util标签,需要在头部导入配置信息

<util:list id="courselist">
    <ref bean="course1"></ref>
    <ref bean="course2"></ref>
</util:list>

这样之间调用courselist就可以注入准备好的两个course类

<!--注入对象数组,引入外部多个bean对象到list集合内-->
<property name="courselist" ref="courselist">
</property>

FactoryBean 工厂bean

之前用的Bean是普通bean

普通bean:        在配置文件中定义的bean类型就是返回类型
工厂bean:        在配置文件中定义的bean类型可以和返回类型不一样

Bean的作用域

在Spring,设置创建的bean实例可以是单例模式也可也不是
默认情况下是单例模式,bean都只创建一个实例对象,复用,对象的地址是相同的

设置多例模式则在bean内设置

 scope:prototype

则现在生成的对象的地址不同,不是同一个对象

Bean的生命周期

  • 1通过构造器创建bean的实例(无参数构造)
  • 2为bean的属性设置值(set方法)
  • 3调用bean的初始化方法(需要进行配置initMethod)
  • 4 生成bean实例化对象
  • 5当容器在关闭的时候,调用bean的销毁方法(需要配置destoryMethod)

初始化和销毁的方法设置在类内,然后在xml的bean内加入属性值:

<bean id="orders" class="com.yuan.spring53.Orders" 
init-method="initMethod" 
destroy-method="destoryMethod"     >

测试结果:
在这里插入图片描述

添加后置处理器则会使bean变成7个生命周期 继承此BeanPostProcessor即可
如果加上,则会在初始化阶段的上下加入两个方法,分别为:
postProcessBeforeInitialization 和 postProcessAfterInitialization
就变成了7步周期

Xml自动装配

根据指定的装配规则,Spring自动将匹配的属性值进行注入
Autowire属性:

  • byName根据属性名称注入
  • byType 根据属性类型注入
<!--
实现自动装配  
        bean标签属性autowire,自动装配
        有两个值:
             byName:根据属性名称注入
             byType:根据属性类型注入
    -->
    <bean id="emp" class="com.yuan.autowire.Emp" autowire="byName">
    </bean>
    <bean id="dept" class="com.yuan.autowire.Dept"></bean>

引入外部属性文件

1.一般的创建连接池方式

<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc://mysql://localhost:3306/userDb"></property>
    <property name="username" value="root"></property>
    <property name="password" value="yuan"></property>
</bean>

2.引入外部的properties来自动设置连接池的参数

引入context名称空间标签

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--配置连接池  引入外部的文件,这样直接修改外部文件,就可以改变生成的连接池对象-->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${prop.driverClass}"></property>
    <property name="url" value="${prop.url}"></property>
    <property name="username" value="${prop.username}"></property>
    <property name="password" value="${prop.password}"></property>
</bean>

引入外部的文件,这样直接修改外部文件,就可以改变生成的连接池对象

以上是我在尚硅谷视频学习的笔记总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值