Spring5框架部分学习笔记--IOC部分(XMl配置)

框架概述

Rod Johnson创的开源框架

​ Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于J2EE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

总结

  1. Spring是轻量级的开源的JavaEE,框架

  2. Spring可以解决企业应用开发的复杂性

  3. Spring有两个核心部分:IOC和 Aop
    (1)IOC:控制反转,把创建对象过程交给Spring进行管理

    (2) Aop:面向切面,不修改源代码进行功能增强

补充Spring特点

  1. 方便解耦,简化开发
  2. Aop,编程支持
  3. 方便程序测试
  4. 方便和其他框架进行整合
  5. 方便进行事务操作
  6. 降低API开发难度。

入门案例

下载sping相关jar包

通过百度网盘分享的文件:commons-…等2个文件
链接:https://pan.baidu.com/s/1bUMlbUkdaXbor1EOD8r9Jg
提取码:9o4m
复制这段内容打开「百度网盘APP 即可获取」

常用jar包

导入jar包到idea

先创建普通Java工程

创建lib目录用于存放jar包

然后 citr + c 复制那5个jar包 ,再然后citr + v复制到创建的lib目录里面

导入jar包

选要用的5个jar包,然后点ok

先点Apply,再点ok

创建User类

public class User {
   public void add(){
       System.out.println("add方法执行了");
   }
}

xml文件配置

测试类

public class Test {
    public static void main(String[] args) {
        //加载xml配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//类 全路径 xml 应用 文本

        //通过配置文件里面的id值,找到创建的对象(这个对象在加载xml文件时就创建了)
        User user1 = context.getBean("user1", User.class);
        user1.add();
    }
}

IOC容器

底层原理1:IOC(概念和原理)

  1. 什么是IOC
    (1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理

    (2)使用IOC目的:为了耦合度降低
    (3) 做入门案例就是IOC实现

  2. IOC底层原理
    (1) xml解析、工厂模式、反射

  3. 画图讲解IOC底层原理

底层原理2:IOC的接口

  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
  2. Spring提供I0C容器实现两种方式:(两个接口)
    (1) BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用-加载配置文件时候不会创建对象,在获取对象〈使用)才去创建对象
    (2) ApplicationContext:是BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建
  3. ApplicationContext 接口有实现类

IOC容器-Bean管理-XML方式

什么是Bean管理

Bean管理指的是两个操作

  1. Spring创建对象
  1. Spirng注入属性(设置属性)

Bean管理操作有两种方式

  1. 基于xml配置文件方式实现
  2. 基于注解方式实现

IOC操作bean管理

用XML的方式创建对象

<bean id="user1" class="com.hxp.spring_5.User"></bean>

(1)在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建.

(2)在bean标签有很多属性,介绍常用的属性
*id属性:唯一标识创建的对象
*class属性:类全路径(包类路径)。
(3)创建对象时候,默认也是执行无参数构造方法完成对象创建

用XML的方式注入属性

DI:依赖注入,就是注入属性((面试可能会问DI和IOC的区别)

第一种注入方式:使用set方法进行注入

(本质上是调用的set方法设置属性值)

(1) 先要创建类,定义属性和对应的set方法

 private String bname;
    private String bauthor;

    public void setBname(String bname) {
        this.bname = bname;
    }

    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }

​ (2)然后在xml文件中配置对象创建,配置属性注入

 <bean id="book" class="com.hxp.spring_5.book">
                <property name="bname" value="完美世界"></property>
                <property name="bauthor" value="辰东"></property>
 </bean>

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

​ (1)先创建有参构造器

public Orders(String oname, String address) {
        this.oname = oname;
        this.address = address;
}

​ (2)然后在xml里面配置,创建对象和设置属性

<bean id="orders" class="com.hxp.spring_5.Orders">
                <constructor-arg name="oname" value="gg"></constructor-arg>
                <constructor-arg name="address" value="12345"></constructor-arg>
</bean>

通过p命名空间注入

​ (1)添加p名称空间在配置文件中

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

​ (2)设置属性,在Bean标签里面因为刚刚添加了p名称空间所以可以通过p设置

<bean id="book" class="com.hxp.spring_5.Book" p:bname="完美世界" p:bauthor="辰东">
</bean>

xml注入其他类型的属性

1.字面量

(1)null

<bean id="book" class="com.hxp.spring_5.Book">
    <property name="bname">
    	<null/>
    </property>

    <property name="bauthor">
    	<null/>
    </property>
</bean>

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

    <bean id="book" class="com.hxp.spring_5.Book">
        //1.转义方式
                <property name="bname" value="&lt;&lt;Java&gt;&gt;">
                </property>
		//2.CDATA方式
                <property name="bauthor">
                        <value><![CDATA[<<南京>>]]></value>
                </property>
        </bean>

xml注入属性-外部bean

  1. 创建两个类service类和dao类
public class UserDaoIpml implements UserDao{
    public void add(){
        System.out.println("dao……add");
    }
}
public class UserService {
    private UserDaoIpml userDaoIpml;

    public void setUserDaoIpml(UserDaoIpml userDaoIpml) {
        this.userDaoIpml = userDaoIpml;
    }

    public void serviceAdd(){
        System.out.println("service……add");
        userDaoIpml.add();
    }

    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean2.xml");
        //UserDaoIpml dao = context.getBean("dao", UserDaoIpml.class);
        UserService ser = context.getBean("ser", UserService.class);
        ser.serviceAdd();

    }
}
  1. 在 service 调用dao里面的方法
public void serviceAdd(){
        System.out.println("service……add");
        userDaoIpml.add();
}
  1. 在spring配置文件中进行配置。
<?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 id="ser" class="com.hxp.service.UserService">
        <property name="userDaoIpml" ref="dao"></property>
    </bean>
    <bean id="dao" class="com.hxp.dao.UserDaoIpml">

    </bean>
</beans>

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

(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门部门是一,员工是多。
(2) 在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

代码

//1.创建dept部门类
public class Dept {
    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "dname='" + dname + '\'' +
                '}';
    }
}
<?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">

    //3.1.创建对象和设置属性 -- 方法一 -- 内部级联
    <bean id="emp1" class="com.hxp.bean.Emp">
        <property name="ename" value="血小板"></property>
        <property name="gender" value="女"></property>
        <property name="dept">
            <bean id="dept1" class="com.hxp.bean.Dept">
                <property name="dname" value="血管部门"></property>
            </bean>
        </property>
    </bean>
     
     //3.2.创建对象和设置属性 -- 方法二 -- 外部级联          
    <!--    <bean id="emp1" class="com.hxp.bean.Emp">-->
<!--        <property name="ename" value="血小板"></property>-->
<!--        <property name="gender" value="女"></property>-->
<!--        <property name="dept" ref="dept1">-->
<!--        </property>-->
<!--    </bean>-->
<!--    <bean id="dept1" class="com.hxp.bean.Dept">-->
<!--        <property name="dname" value="血管部门"></property>-->
<!--    </bean>-->
</beans>
package com.hxp.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

//2.创建Emp员工类
public class Emp {
    private String ename;
    private String gender;
    private Dept dept;

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public void test(){
        System.out.println(ename + " " + gender + " " + dept);
    }

    //4.测试
    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean3.xml");
        Emp emp1 = context.getBean("emp1", Emp.class);

        emp1.test();
    }
}

xml注入集合类型的属性

  1. 注入数组类型属性
  2. 注入List集合类型属性
  3. 注入Map集合类型属性
  4. 注入Set集合类型属性
package com.hxp.spring5.collectiontype;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Stu {
    private String[] courses;
    private List<String> lists;
    private Map<String,String> map;

    private Set<String> sets;

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public void setLists(List<String> lists) {
        this.lists = lists;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "courses=" + Arrays.toString(courses) +
                ", lists=" + lists +
                ", map=" + map +
                ", sets=" + sets +
                '}';
    }
}
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="stu1" class="com.hxp.spring5.collectiontype.Stu">
<!--        设置数组-->
        <property name="courses">
            <array>
                <value>数据结构与算法</value>
                <value>计算机网络</value>
            </array>
        </property>

<!--        设置list集合-->
        <property name="lists">
            <list>
                <value>唐三</value>
                <value>十号</value>
                <value>萧炎</value>
            </list>
        </property>

<!--        设置map集合-->
        <property name="map">
            <map>
                <entry key="map1" value="Map1"></entry>
                <entry key="map2" value="Map2"></entry>
            </map>
        </property>

<!--        设置set集合-->
        <property name="sets">
            <set>
                <value>MySql</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
</beans>
package com.hxp.spring5.collectiontype;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;

public class Course {
    @Test
    public void test(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu1 = context.getBean("stu1", Stu.class);

        System.out.println(stu1);
    }
}
  1. 注意1:往集合里面注入对象,可以用外部bean的方式注入
//重新写一个属性 里面存对象
private List<Course> courseList;

    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
}
public class Course {
    private String courseName;

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                '}';
    }
}
<!--        配置xml文件-->
<bean id="stu1" class="com.hxp.spring5.collectiontype.Stu">   
	<property name="courseList">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
    </bean>

    <bean id="course1" class="com.hxp.spring5.collectiontype.Course">
        <property name="courseName" value="数据结构与算法"></property>
    </bean>
    <bean id="course2" class="com.hxp.spring5.collectiontype.Course">
        <property name="courseName" value="计算机网络"></property>
    </bean>
  1. 注意2:可以把集合里面的对象提取出来作为一个公共集合,让其他集合(对象)也可以使用

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--        配置util  第5行和第7-->
       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">

    <util:list id="list1">
        <value>易筋经</value>
        <value>九阳神功</value>
        <value>降龙十八掌</value>
    </util:list>

    <bean id="book1" class="com.hxp.spring5.collectiontype.Book">
        <property name="bookList" ref="list1"></property>
    </bean>
</beans>

​ (3)测试

package com.hxp.spring5.collectiontype;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Book {
    private List<String> bookList;

    public void setBookList(List<String> bookList) {
        this.bookList = bookList;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookList=" + bookList +
                '}';
    }

    public static void main(String[] args) {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book1", Book.class);

        System.out.println(book);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值