栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring 第二讲:IOC容器、IOC接口、IOC操作Bean管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring 第二讲:IOC容器、IOC接口、IOC操作Bean管理

一、IOC 容器 1、什么是 IOC

(1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理。
(2)使用IOC目的:降低耦合度。
(3)入门案例就是IOC实现。

2、IOC 底层原理
  • 工厂模式
  • xml 解析
  • 反射
3、工厂模式

原始方法先 new 对象,在调用方法。

工厂模式存在一个中间工厂,用来返回对象。相比传统模式,降低了耦合度。

4、xml解析、反射

第一步 xml 配置文件,配置创建的对象


第二步 有 service 类和 dao 类,创建工厂类

class UserFactory{
	public static UserDao getDao(){
		String classValue = "com.spring5.User"; //1.xml解析
		Class clazz = Class.forName(classValue); //2.通过反射创建对象
		return (UserDao)clazz.newInstance();
	}	
}
二、IOC 接口(BeanFactory 和 ApplicationContext) 1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂。 2、两个重要的接口(Spring 提供 IOC 容器实现的两种方式) (1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用。

注意: 加载配置文件时候不会创建对象,在使用对象时才去创建对象。

    BeanFactory context = new ClassPathXmlApplicationContext("bean1.xml");
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用。

注意: 加载配置文件时候就会创建对象。(服务器在启动时需要完成创建,节约时间、资源,一般使用这种方式)

	ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
3、ApplicationContext 接口实现类

(掌握)FileSystemXmlApplicationContext:对应盘下的全路径
(掌握)ClassPathXmlApplicationContext:xml文件名
(了解)ConfigurableApplicationContext:扩展功能

三、IOC 操作 Bean 管理 1、什么是 Bean 管理 (1)Spring 创建对象 (2)Spring 注入属性 2、Bean 管理操作的两种方式 (1)基于 xml 配置文件方式实现。 (2)基于注解方式实现。 3、IOC 操作 Bean 管理(基于 xml 方式) 3.1 基于 xml 方式创建对象
    
    

(1)在 Spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建。
(2)在 bean 标签有很多属性,介绍常用的属性。

属性作用
id起名称 ,根据id 获得配置对象
class创建对象所在全路径
name功能和id一样 ,id不能包含特殊符号,name可以(基本不用,为了满足struts1遗留问题)
scopeBean的作用范围
singleton默认值 单例的
prototype多例的
requestweb项目中spring创建一个bean对象,将对象存到request域中
sessionweb项目中…将对象存到session域中
globalSessionweb项目中,应用在prolet环境,如果没有prolet环境那么globalSession相当于session

(3)创建对象时候,默认执行无参构造方法完成对象创建。

3.2 基于 xml 方式注入属性(Set 注入、有参构造注入,p 注入)

(1) DI(IOC的实现):依赖注入,就是注入属性。

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

① 创建类,定义属性和对应的set方法

public class Book {
    //创建属性
    private String bname;
    private String bauthor;
   //set方式注入
    public void setBname(String bname) {
        this.bname = bname;
    }
    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }
    //测试输出书名作者
   public void testOutPut() {
        System.out.println(bname);
        System.out.println(bauthor);
    }
}

② 在 spring 配置文件配置对象创建,配置属性注入(property 标签,k-v 的形式)

     
    
        
        
        
    

③ 编写测试类

    @Test
    public void testBook(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Book book = context.getBean("book",Book.class);
        System.out.println(book);
        book.testOutPut();
    }

④ 结果

(2)第二种注入方式:有参构造进行注入

① 创建类,定义属性,创建属性对应有参数构造方法

public class Orders {

    private String oname;
    private String address;
    
    public Orders(String oname, String address) {
        this.oname = oname;
        this.address = address;
    }
   
    public void ordersTest(){
        System.out.println(oname);
        System.out.println(address);
    }
}

②在 spring 配置文件配置对象创建,配置属性注入(constructor-arg 标签,k-v 的形式)
可以使用 index ,即索引到第几个参数。

 
    
        
        
        
        
        
    

③ 编写测试类

    @Test
    public void testOrders(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Orders orders = context.getBean("orders",Orders.class);
        System.out.println(orders);
        orders.ordersTest();
    }

④ 结果

(3)第三种注入方式:p 名称空间注入

① 添加 p 名称空间在配置文件中

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

② 使用 p:属性 的方式注入属性,可注入多个

	
3.3 基于 xml 方式注入其他类型属性 (1)字面量(null 和 特殊符号)

① null 值

	
    

② 属性值包含特殊符号(使用CDATA)

	
    
         >]]>
    
(2)注入属性 - 外部 bean

① 创建两个类 service 类和 dao 类
② 在 service 调用 dao 里面的方法

public class UserService {

    private UserDao userDao; 
    //set注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        System.out.println("service add...");
        userDao.update();
    }
}

③ 在 Spring 配置文件中进行配置

    
    
        
        
    
    

④ 测试类

    @Test
    public void testAdd(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }
(3)注入属性 - 内部 bean

① 一对多关系:一个部门有多个员工,一个员工属于一个部门,部门是一,员工是多。
② 在实体类之间表示一对多关系
部门类

//部门类
public class Dept {

    private String dname;

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

员工类

//员工类
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;
    }
}

③ 在Spring 配置文件中进行配置

   
    
        
        
        
        
        
            
                
            
        
    

④ 编写测试类

    @Test
    public void testBean2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
        Emp emp = context.getBean("emp", Emp.class);
        System.out.println(emp);
        emp.toString();
    }
(4)注入属性 - 级联赋值

① 第一种方法:
与内部 bean 同类,同方法

    
    
        
        
        
        
        
    
    
        
    

② 第二种方法:

    
    
        
        
        
        
        
        
    
    
3.4 基于 xml 注入集合属性 (1)注入数组类型属性 (2)注入 List 集合类型属性 (3)注入 Map 集合类型属性 (4)注入 Set 集合类型属性 (5)在集合里设置对象类型值

① 创建类,定义数组、list、map、set类型属性,生成对应 set 方法

public class Stu {
    //1.数组类型属性
    private String[] array;
    //2.List集合类型属性
    private List list;
    //3.Map集合类型属性
    private Map maps;
    //4.Set集合类型属性
    private Set sets;

    //5.学生所学多门课程
    private List courseList;

    public void setCourseList(List courseList) {
        this.courseList = courseList;
    }

    public void setArray(String[] course) {
        this.array = course;
    }

    public void setList(List list) {
        this.list = list;
    }

    public void setMaps(Map maps) {
        this.maps = maps;
    }

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

    public void test(){
        System.out.println(Arrays.toString(array));
        System.out.println(list);
        System.out.println(maps);
        System.out.println(sets);
        System.out.println(courseList);
    }
}

② 在Spring 配置文件中进行配置

    
    
        
        
            
                江苏
                吉林
            
        
        
        
            
                南京
                长春
            
        
        
        
            
                
                
            
        
        
        
            
                南京
                长春
            
        
        
        
            
                
                
            
        
    

    
    
        
    
    
        
    

③ 测试类

    @org.junit.Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu = context.getBean("stu",Stu.class);
        stu.test();
    }
(6)把集合注入部分提取出来(作为公共部分)

① 在 Spring 配置文件中引入名称空间 util
加入:

       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 集合注入提取

   
   
       三国演义
       西游记
   

    
    
        
    

③ 测试类

    @org.junit.Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book",Book.class);
        book.test();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号