【Spring】-Spring中Bean对象的存取-LMLPHP

【Spring】-Spring中Bean对象的存取-LMLPHP

文章目录

Spring中Bean的存取方式

一、三大方式存储对象到spring容器中

1、XML方式把Bean存储到spring

1.1、创建Bean类

【Spring】-Spring中Bean对象的存取-LMLPHP

package com.spring.bean;

public class Student {
    private String name;
    private int age;

    public Student(){
        System.out.println("init Student");
    }

    public void wmi(){
        System.out.println("I am student: my name is "+ 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;
    }
}

1.2、将Bean注册到Spring的xml配置文件

【Spring】-Spring中Bean对象的存取-LMLPHP

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

    <!--将类对象,com.spring.bean.Student存进spring容器,名字是student,是一个spring bean-->
    <bean id="student" class="com.spring.bean.Student"/>
    <bean id="teacher" class="com.spring.bean.Teacher"/>
</beans>

2、五大类注解方式 @Controller等存储Bean到spring

2.1、五大类注解和JavaEE标准分层

【Spring】-Spring中Bean对象的存取-LMLPHP

【Spring】-Spring中Bean对象的存取-LMLPHP

2.2、五大类注解方式 往spring中 存储Bean对象

注意点:

  • 和二者缺一不可,如果缺少,报错说没有找到这个Bean对象。
  • 需要存储在spring中的类本身的位置可以在注册的包中或者它的子包中。
  • 这个方法与使用(使用路径+包名+类名)的方式可以混合使用。即如果存在某个类需要存储在spring中,但又不适合放在注册的包里的任何位置,就可以将这个类放在注册包之外,但是使用bean注册当前类对象(即使用XML的方式存取对象)。

3、方法注解方式 @Bean存储对象到spring中

3.1、实体类的命名

3.2、存储Bean对象

  • 1> 方法注解需要配合五大类注解使用。比如UserBeans类下有多个方法注解,在UserBeans上需要加上五大类注解(一般是@Component)。之所以如此,是为了提高效率。
  • 2> 方法注解的对象名可以改名。方法注解 对象的名字不同于五大类注解,方法注解是默认方法名,但是可以在方法注解@Bean后加括号,使用name或value属性给Bean对象改名。

【Spring】-Spring中Bean对象的存取-LMLPHP

注意:

  • 给Bean对象改名后,就不能再使用方法名获取到对象,只能使用修改后的名字。
  • 如果存在方法名相同的两个@Bean方法在不同类中(都未修改名字),当获取Bean对象时可以在方法上添加@Order(数字),数字小的方法会先注入,但是后注入的方法会发生覆盖。

二、获取Bean对象(依赖注入)

1、获取对象的最基本的方法

2.1、获取Spring容器方式

法一:BeanFactory接口和ClassPathResource继承类

// 获取spring容器
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
import com.spring.bean.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class TeacherMain {
    public static void main(String[] args) {
        // 懒汉加载:调用时,才加载spring容器中的bean对象,效率不高,但是内存消耗低。
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

        Student student = (Student) factory.getBean("student");

        student.wmi();
    }
}

法二:ApplicationContext接口和ClassPathXmlApplicationContext继承类

// 获取Spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
import com.spring.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentMain {
    public static void main(String[] args) {
        // 饿汉加载:一次性加载并初始化spring配置文件中的对象,后续操作spring容器中的bean对象时会很快,但是费内存。
        // 1通过resources文件夹中的xml文件名,获取spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        
        // 2获取Bean对象
        Student student2 = context.getBean("student", Student.class);

        // 3使用spring bean对象
        student.wmi();
    }
}

2.2、getBean获取指定的Bean对象

【Spring】-Spring中Bean对象的存取-LMLPHP

2.3、获取Bean对象的名称的命名源码分析

在获取Bean对象时,Bean对象名是什么?
首先,为了突出重点,我们先直接亮出结论:

现在,我们查看spring源码,印证我们的结论:

2、使用依赖注入从spring获取对象

2.1、法一:属性注入

2.2、法二:setter注入

2.3、法三:构造方法注入

补充:在依赖注入中 @Autowired和 @Resource的区别

08-12 11:52