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

Spring 第二讲:IOC容器、IOC接口、IOC *** 作Bean管理,第1张

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();
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5677702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存