获取并使用 bean 对象
获取并使⽤ Bean 对象,分为以下 3 步:
- 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那
- 么就得先得到 Spring 的上下⽂。
- 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
- 使⽤ Bean 对象。
获取 bean 的方法一
public class App { public static void main(String[] args) { //1. 获取 spring 上下文对象, 注意后面需填写添加配置的文件名称 ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //2. 获取 bean 对象, 后面的字符串要与我们之前取的名字相匹配, // 获取到的 bean 是 object 类型的, 需强制类型转换 Student student = (Student)context.getBean("student"); //检验对象是否获取到 System.out.println(student.sayHi("佩奇")); } }
获取 bean 的方法二
public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //这里是直接通过类类型来获取 bean 对象, 所以返回的值不需要转换 Student student = context.getBean(Student.class); //Student student = (Student)context.getBean("student"); System.out.println(student.sayHi("佩奇")); } }
当我们 Student 仅有一个 bean 对象时, 这样直接通过类名来获取 bean 对象显然没问题, 但若 Student 存在多个 bean 对象呢 ? 它会获取到哪个 bean 对象呢 ?
这里我们载注册一个 Student 类的 bean 对象, 并取名为 student2.
来看看获取效果 :
报错信息是 : 找到两个匹配结果, 但它只期望有一个结果.
如果是用 id 来获取就不会出现这种情况了, 因为每个 bean 都有唯一的 id.
获取 bean 的方法三
public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //通过 id 获取 bean, 并将所得 bean 转为 Student 类型, 无需类型转换了 Student student = context.getBean("student", Student.class); //Student student = context.getBean(Student.class); //Student student = (Student)context.getBean("student"); System.out.println(student.sayHi("佩奇")); } }
ApplicationContext 和 BeanFactory 的区别 (重点)
其实 BeanFactory 也可以获取 Bean 对象.
public class App { public static void main(String[] args) { BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); //ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); //通过 id 获取 bean, 并将所得 bean 转为 Student 类型, 无需类型转换了 Student student = context.getBean("student", Student.class); //Student student = context.getBean(Student.class); //Student student = (Student)context.getBean("student"); System.out.println(student.sayHi("佩奇")); } }
ApplicationContext 和 BeanFactory 效果是⼀样的, 那它们之间的区别是什么呢 ?
区别 :
- ApplicationContext 是 BeanFactory 的子类, ApplicationContext 不仅拥有父类的所有方法, 还扩展了很多父类没有的方法. (国际化支持、资源访问支持、事件传播支持等)
- ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象, ⽽ BeanFactory 是懒加载(需要哪个才去加载哪个), 因此更加轻量.
总结
1.操作容器之前, 先要有容器, 所以先要得到容器.
2.存对象
a. 创建 Bean (普通类).
b. 将 Bean 注册(配置)到 spring-confing.xml 中.
3.取对象
a. 得到 Spring 上下⽂, 并读取到 Spring 的配置⽂件.
b. 获取某⼀个 Bean 对象.
c. 使⽤ Bean 对象.