Spring IOC

什么是Spring框架

它是一个容器.它是整合其它框架的框架.它的核心是IOC和AOP.它由20多个模块构成.它在很多领域都提供优秀的解决方案.

Spring的特点

1)轻量级
由20多个模块构成,每个jar包都很小,小于1M,核心包也就3M左右.
对代码无污染.

2)面向接口编程
使用接口,就是面向灵活,项目的可扩展性,可维护性都极高.接口不关心实现类的类型.使用时接口指向实现类,切换实现类即可切换整个功能.

3)AOP:面向切面编程
就是将公共的,通用的,重复的代码单独开发,在需要的时候反织回去.底层的原理是动态代理.

4)整合其它框架
它整合后使其它框架更易用.

一、IOC容器

1、什么是IOC(控制反转)

​ a)把对象创建和对象之间的调用过程,交给Spring进行管理

​ b)使用IOC目的:为了降低耦合度
​ c)控制反转IoC(Inversion of Control)是一个概念,是一种思想。由Spring容器进行对象的创建和依赖注入.程序员在使用时直接取出使用.

切记:Spring容器在启动时,就创建所有的对象

2、IOC底层

​ a)xml解析、工厂模式、反射

3、Spring提供的IOC容器实现的两种方式(两个接口)

​ 1)BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用
(加载配置文件时候不会创建对象,在获取对象时才会创建对象。(在用的时候才创建))

​ 2)ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用
(加载配置文件时候就会把在配置文件对象进行创建)推荐使用

二、ioc容器创建对象

1、简单对象创建

User对象

public class User {
    private  String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

bean.xml
ioc获取class的值,通过反射获取class对象,如何就能通过class对象获取User实体类对象

<?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">

<!-- ioc获取class的值,通过反射获取class对象,如何就能通过class对象获取User实体类对象-->
    <bean id="user" class="com.User"></bean>
</beans>

test

public class Test01 {

    @Test
    public void test(){
//        1、加载spring配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

//        2、获取创建对象
        User user = context.getBean("user", User.class);


    }
}

2、基于XML注入属性 (DI依赖注入)

User对象

public class User {
    private  String name;
	private  int age;
    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age= age;
    }
}

a、使用set
<!-- 传统方法使用set对对象属性进行注入-->
<!-- spring方式: 也是使用对象的set方法,但是是使用xml进行依赖注入-->
<bean id="user" class="com.User">
    <!--使用property完成属性注入
        name:类里面属性名称
        value:向属性注入的值
    -->
    <property name="name" value="Hello"></property>
    <property name="age" value="18"></property>
</bean>
b、有参构造函数注入
<bean id="user" class="com.User">
    <constructor-arg name="name" value="Hello"></constructor-arg>
    <constructor-arg name="age" value="18!"></constructor-arg>
</bean>
c、p名称空间注入
<!--1、添加p名称空间在配置文件头部-->
<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"		
       <!--在这里添加一行p-->

<!--2、在bean标签进行属性注入(算是set方式注入的简化操作)-->
    <bean id="user" class="com.User" p:name="hello" p:age="18">
    </bean>
d、注入空值和特殊符号
<bean id="user" class="com.User">
    <!--(1)null值-->
    <property name="name">
        <null/><!--属性里边添加一个null标签-->
    </property>
    
    <!--(2)特殊符号赋值-->
     <!--属性值包含特殊符号
       a 把<>进行转义 &lt; &gt;
       b 把带特殊符号内容写到CDATA
      -->
        <property name="name">
            <value><![CDATA[<<南京>>]]></value>
        </property>
</bean>
e、注入外部bean(ref)

在user实体类加一行

private Course course;
// get,set方法
<!--1 service和dao对象创建-->
<bean id="user" class="com.User">
    <!--注入userDao对象
        name属性:类里面属性名称
        ref属性:创建course对象bean标签id值
    -->
    <property name="course" ref="course"></property>
    <property name="course.name" value="spring"></property>
</bean>
<bean id="course" class="com.Course"></bean>
f、IOC 操作 Bean 管理——xml 注入集合属性
//(1)创建类,定义数组、list、map、set 类型属性,生成对应 set 方法
public class Stu {
    //1 数组类型属性
    private String[] courses;
    //2 list集合类型属性
    private List<String> list;
    //3 map集合类型属性
    private Map<String,String> maps;
    //4 set集合类型属性
    private Set<String> sets;
    
    public void setSets(Set<String> sets) {
        this.sets = sets;
    }
    public void setCourses(String[] courses) {
        this.courses = courses;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }
<!--(2)在 spring 配置文件进行配置-->
    <bean id="stu" class="com.Stu">
        <!--数组类型属性注入-->
        <property name="courses">
            <array>
                <value>java课程</value>
                <value>数据库课程</value>
            </array>
        </property>
        <!--list类型属性注入-->
        <property name="list">
            <list>
                <value>张三</value>
                <value>小三</value>
            </list>
        </property>
        <!--map类型属性注入-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <!--set类型属性注入-->
        <property name="sets">
            <set>
                <value>MySQL</value>
                <value>Redis</value>
            </set>
        </property>
</bean>
g、在集合里面设置对象类型值
//学生所学多门课程
    private List<Course> courseList;//创建集合
    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }
 <!--创建多个course对象-->
    <bean id="course1" class="com.Course">
        <property name="cname" value="Spring5框架"></property>
    </bean>
    <bean id="course2" class="com.Course">
        <property name="cname" value="MyBatis框架"></property>
    </bean>
    
   	<!--注入list集合类型,值是对象-->
       <property name="courseList">
           <list>
               <ref bean="course1"></ref>
               <ref bean="course2"></ref>
           </list>
       </property>
<!--第一步:在 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:util="http://www.springframework.org/schema/util" <!--添加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">  <!--添加util名称空间-->
    
<!--第二步:使用 util 标签完成 list 集合注入提取-->
<!--把集合注入部分提取出来-->
 <!--1 提取list集合类型属性注入-->
    <util:list id="bookList">
        <value>易筋经</value>
        <value>九阴真经</value>
        <value>九阳神功</value>
    </util:list>

 <!--2 提取list集合类型属性注入使用-->
    <bean id="book" class="com.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

Spring IOC(Bean管理)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值