IOC的总结

一、IOC(接口)

1.IOC的思想基于IOC容器完成,IOC容器底层就是对象工厂

2.Spring提供IOC容器实现两种方式:(两个接口)

(1)BeanFactory

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

(2)ApplicationContext

  • BeanFactory接口的子接口,提供更强大的功能,一般由开发人员使用
  • 加载配置文件时就会把对象进行创建

3.ApplicationContext

在这里插入图片描述

二、IOC操作Bean管理

1、什么是Bean管理:Bean管理指的是两个操作

(1)Spring创建对象

(2)Spring注入属性

2、Bean管理操作有两种方式

(1)基于xml配置文件方式实现

1、基于xml方式创建对象

在这里插入图片描述

1)在Spring配置文件中,使用bean标签,标签内添加属性,就可以实现对象的创建

2)在bean标签内有很多属性:

  • id:唯一标识
  • class属性:类全路径(包类路径)

3)创建对象时,默认也是执行无参构造方法完成对象的创建

2、基于xml方式注入属性

(1)DI:依赖注入,就是注入属性

Ⅰ、使用set方法进行注入

public class Book{
    private String name;
    private String author;
    
    public void setName(String name){
        this.name = name;
    }
    
    public void setAuthor(String author){
        this.author =  author;
    }
    
    public static void main(String[] args){
        Book book = new Book();
        book.setName("aaa");
        book.setAuthor("张三");
    }
}

2)在Spring配置文件配置对象创建,配置属性注入

<!--set方法注入属性-->
<bean id = "book" class = "com.Spring.Book">
	<!--使用property完成属性的注入
		name:类内中的属性值
		value:向属性中注入的值
	-->
    <property name="name" value = "aaa"></property>
    <property name="author" value = "张三"></property>
</bean>

Ⅱ、使用有参构造器注入

public class User{
    private String username;
    private String password;
    
   public void User(String username,String password){
       this.username = username;
       this.password = password;
   }
    
    public static void main(String[] args){
        Book book = new Book();
        book.setName("张三");
        book.setAuthor("123456");
    }
}

2)在Spring配置文件配置对象创建,配置属性注入

<!--set方法注入属性-->
<bean id = "user" class = "com.Spring.User">
	<!--使用 constructor-arg 完成属性的注入
		name:类内中的属性值
		value:向属性中注入的值
	-->
    <contructor-arg name="username" value = "张三"></contructor-arg>
  	<contructor-arg name="password" value = "123456"></contructor-arg>
    <!--
也可以通过index所用值开始注入  下标从0开始 表示第一个有参构造器内的的属性

    <contructor-arg index = "" value=""></contructor-arg>
-->
</bean>

Ⅲ、p名称空间注入(了解)

(1)使用p名称空间注入,可以简化基于xml得配置方式

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

在这里插入图片描述

②进行属性注入,在bean中注入

<bean id = "book" class = "com.Spring.Book" p:name="aaa" p:author="张三">
</bean>

1、字面量

(1)null值

<!--set方法注入属性-->
<bean id = "book" class = "com.Spring.Book">
    <property name="name" value = "aaa"></property>
    <property name="author" value = "张三"></property>
    <!--null值-->
    <property name="address">
        	<null/>
    </property>
</bean>

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

<!--set方法注入属性-->
<bean id = "book" class = "com.Spring.Book">
    <property name="name" value = "aaa"></property>
    <property name="author" value = "张三"></property>
    <!--属性值包含特殊符号
	1.转义
    2.把特殊符号写道CDATA中

-->
     <property name="address">
         <value><![CDATA[<<南京>>]]></value>
    </property>
</bean>

2、注入属性-外部bean

建立Dao类 Service类 程序写好后 xml文件中配置如下:

    <bean id="userService" class="com.company.Service.UserService">
<!--        注入userDao的对象
            name属性值:类中属性的名称
            ref
-->
        <property name="userDao" ref="userDao"></property>
    </bean>
<!--因为Dao类为接口 无法new对象 所以此处指向DaoImpl-->
<bean id = "userDao" class="com.company.Dao.UserDaoImpl"></bean>    

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

①一对多关系:部门和员工

一个部门有多个员工,一个员工属于一个部门 ,部门是一,员工是多

部门类:

package com.company.bean;

public class Dept {
    private String dname;

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

员工类:

package com.company.bean;

public class Emp {
    private String name;
    private String gender;
    private Dept dept;

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

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

    public void setDept(Dept dept) {
        this.dept = dept;
    }
}

③在Spring文件中进行相关的配置

    <bean id = "emp" class="com.company.bean.Emp">
        <!--设置普通属性-->
        <property name="name" value="lucy"></property>
        <property name="gender" value=""></property>
		<!--设置对象类的属性-->
        <property name="dept">
            <bean id="dept" class="com.company.bean.Dept">
                <property name="dname" value="财务部"></property>
            </bean>
        </property>
    </bean>

4、注入属性–级联赋值

写法:

<bean id = "emp" class="com.company.bean.Emp">
        <!--设置普通属性-->
        <property name="name" value="lucy"></property>
        <property name="gender" value=""></property>
		<!--级联赋值-->
    	<property name="dept" ref"dept"></property>
    </bean>
	<bean id="dept" calss="com.company.bean.Dept">
        <property name="daname" value="财务部"></property>
</bean>

<bean id = "emp" class="com.company.bean.Emp">
        <!--设置普通属性-->
        <property name="name" value="lucy"></property>
        <property name="gender" value=""></property>
		<!--级联赋值-->
    	<property name="dept" ref"dept"></property>
   		 <!--需要设置dept的get方法,否则此处报红-->
    	<property name="dept.dname" ref"dept"></property>
    </bean>
	<bean id="dept" calss="com.company.bean.Dept">
        <property name="dname" value="财务部"></property>
</bean>
3、IOC操作Bean管理(xml注入集合属性)
  • 注入数组类型属性

  • 注入List集合类型属性

  • 注入Map集合类型属性

①创建对应的属性值和set方法

package com.company.bean;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class stu {

    private String[] arr;
    private List<String> list;
    private Map<String,String> map;
    private Set<String> set;

    public void setArr(String[] arr) {
        this.arr = arr;
    }

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

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

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void print(){
        System.out.println(Arrays.toString(arr));
        System.out.println(list);
        System.out.println(map);
        System.out.println(set);
    }
}

②配置相关的xml文件

    <bean id="stu" class="com.company.bean.stu">
        
<!--        数组注入-->
        <property name="arr">
            <array>
                <value>java课程</value>
                <value>Python课程</value>
            </array>
        </property>

<!--        集合注入-->
        <property name="list">
            <list>
                <value>Mysql</value>
                <value>C++</value>
            </list>
        </property>

<!--        Map集合注入-->
        <property name="map">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>

<!--        Set集合注入-->
        <property  name="set">
            <set>
                <value>Redis</value>
                <value>C</value>
            </set>
        </property>
    </bean>

list集合中放入对象时xml文件的配置

package com.company.bean;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class stu {
    //假设已经有Courses这个类
    private List<Courses> list;

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

xml文件内容:

 <bean id="stu" class="com.company.bean.stu">	       
	<property name="list">
            <list>
                <ref bean="course1"></ref>
                <ref bean="course2"></ref>
            </list>
        </property>
     <bean/>
     <bean id="course1" class="com.company.bean.Courses">
         <property name="name" value="Spring框架"></property>
     </bean>
      <bean id="course2" class="com.company.bean.Courses">
         <property name="name" value="Mysql"></property>
     </bean>
4、把集合注入部分提取出来

①在Spring文件中那个引入名称空间util
在这里插入图片描述

②使用util标签完成list集合注入提取

<!--    提取list集合属性注入-->
        <util:list id="booklist">
            <value>易筋经</value>
            <value>九阴真经</value>
            <value>九阳神功</value>
        </util:list>

<!--    2、提取list集合属性类型注入 使用-->
        <bean id="book" class="com.company.bean.Book">
            <property name="list" ref="booklist"> </property>
        </bean>
5、IOC操作Bean管理(FactoryBean)

Ⅰ、Spring有两种类型的Bean,一种普通的bean,另外一种工厂Bean(FactoryBean)

Ⅱ、普通bean:在配置文件中定义bean类型就是返回类型

Ⅲ、工厂bean:在配置文件中定义bean类型可以和返回类型不一样

例:

package com.company;

import com.company.bean.Course;
import org.springframework.beans.factory.FactoryBean;

public class MyBean implements FactoryBean<Course> {
    @Override
   public Course getObject() throws Exception {
        Course course = new Course();
        course.setCourse("Mysql简介");
        return course;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

Course类

public class Course {
    private String course;

    public void setCourse(String course) {
        this.course = course;
    }
    
     public String toString() {
        return "Course{" +
                "course='" + course + '\'' +
                '}';
    }
}

测试类:

public class MyBeanTest {
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
        //此处由Coures指向MyBean文件
        Course course = context.getBean("myBean", Course.class);
        System.out.println(course);
    }
}

xml

  <bean id="myBean" class="com.company.MyBean"> </bean>
6、IOC操作Bean管理(Bean的作用域)

Ⅰ、在Spring中,设置创建bean实例是单实例还是多实例

Ⅱ、在Spring中默认情况下bean是单实例对象(多次new对象之后输出时指向的地址值相同)

在这里插入图片描述

Ⅲ、如何设置时单实例还是多实例

①在spring配置文件bean标签中有属性(scope)用于设置单实例还是多实例

②scope属性值

  • singleton 默认值表示是单实例对象
  • prototype 表示多实例对象

在这里插入图片描述

在这里插入图片描述

③singleton和prototype的区别

  • singleton单实例,prototype多实例

  • 设置scope值是singleton时候,加载spring配置文件的时候就会创建单实例对象

    设置scope值是prototype时,不是在加载spring时配置文件时创建对象,在调用getBean方法时创建多实例对象

7、IOC操作Bean管理(Bean的生命周期)

Ⅰ、生命周期:从对象创建到销毁的过程

Ⅱ、bean生命周期

①通过构造器创建bean实例(无参数构造)

②为bean的属性设置值和对其他bean的引用(调用set方法)

③调用bean的初始化的方法(需要进行配置)

④bean可以使用了(对象获取到)

⑤当容器关闭时,调用bean的销毁的方法(需要自己配置)

Ⅲ、演示生命周期

package com.company.bean;

public class Orders {
    private String oname;

    public Orders() {
        System.out.println("第一步 执行无参构造创建bean实例");
    }

    public void setOname(String oname) {
        this.oname = oname;
        System.out.println("第二步 调用set方法设置属性值");
    }

    public void initMethod(){
        System.out.println("第三步 执行初始化的方法");
    }

    public  void destoryMethod(){
        System.out.println("第五步 执行销毁的方法");
    }
}
<bean id="orders" class="com.company.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
    <property name="oname" value="手机"> </property>
    </bean>

Test

   public void test(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean6.xml");
        Orders orders = context.getBean("orders", Orders.class);
        System.out.println("第四步 获取创建bean实例对象");
        System.out.println(orders);
        //手动销毁
        context.close();
    }

在这里插入图片描述

8、IOC操作Bean管理(xml自动装配)

Ⅰ、什么是自动装配

①根据装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入

Ⅱ、演示自动装配过程

①根据属性名称注入

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

②根据属性类型自动注入

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

(3)在xml文件中引入外部属性文件

①导入Druid.jar包

在这里插入图片描述

②新建jdbc.properties文件,进行配置

在这里插入图片描述

③配置xml文件
在这里插入图片描述

(4)IOC操作bean管理(基于注解方式)

①什么是注解

  • 是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)

  • 使用注解,注解可以作用在类上面,方法上面,属性上面

  • 使用注解的目的:简化xml配置

②Spring针对Bean管理中创建对象提供注解

Ⅰ、@Component

Ⅱ、@Service

Ⅲ、@Controller

Ⅳ、@Respository

上面四个注解功能一样,都可以用来创建bean实例

③基于注解方式实现对象创建

第一步 引入依赖

在这里插入图片描述

第二步 开启组件扫描
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值