什么是 Spring容器和Bean
Spring
Spring的核心容器就是一个大工厂,所有对象都会被Spring核心容器管理,Spring框架的本质就是,通过XML配置来驱动Java代码,这样就可以把原本由Java代码管理的耦合关系,提取到XMl配置文件中管理,这就实现了,系统中的各组件的解耦有利于后期升级和维护。Spring容器中的一切对象都称为Bean,Spring 对Bean没有任何要求,只要它是Java类即可。
对于Spring框架而言,一切Java对象(只要它是Java类即可)都是Bean。
public class User {
private String name;
//User的无参构造器
public User() {
System.out.println("User的无参构造器被调用");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("调用了User的setName方法");
this.name = name;
}
}
对于<bean ...>
元素,默认以反射方式来调用该类的无参构造器,其class 反射的必须为实现类并不是接口,对于<property...
它驱动Spring在底层以反射执行一次setter方法,其中的<property...
的name 属性值决定执行那一个setter方法,每个<property...
元素默认Spring调用一次setter方法。
<!-- 向spring 添加 bean -->
<bean id="user" class="com.test.spring.model.User">
<!-- 控制setName()方法,将"老王"给user.name赋值 -->
<property name="name" value="老王"></property>
</bean>
<!-- 配置名为:win的bean,其实现类为:javax.swing.JFrame-->
<bean id="win" class="javax.swing.JFrame"></bean>
<!-- 配置名为:date的bean,其实现类为:java.util.Date -->
<bean id="date" class="java.util.Date"></bean>
Spring 常用获取Bean的方法:
T getBean(String name,Class<T> requireType)
返回requireTypeObjcet getBean(String name)
返回Object类型。(String name)可以是id和别名。
@Test
public void springTest(){
//加载spring配置文件,获取Sprting容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
//根据bean的 id 和 User.class获取bean(指定了 Bean的类型)
User user = applicationContext.getBean("user",User.class);
System.out.println("获取spring.xml对User的赋值:"+user.getName());
//设置时间格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd") ;
Date date = new Date();
System.out.println("通过new:"+sf.format(date.getTime()));
// 根据bena的id获取bean,获取得到的是Objcet类型需要强转
Date date2 = (Date) applicationContext.getBean("date");
System.out.println("获取Spring容器里面的Date:"+sf.format(date2.getTime()));
}
ApplictionContext 与 BeanFactory
Spring容器最基本的接口是BeanFactory 负责配置、创建、管理Bean,它有一个子接口: AnpplicationContext(Spring的上下文),它争强了Beanfactory的功能。Spring容器还负责管理Bean与Bean之间的依赖关系。
当系统创建ApplicationContext ,默认会初始化所有的singletion Bean包括构造器创建Bean实例,并根据<property...
元素执行setter方法。当系统创建ApplicationContext,前期有比较大的系统开销,但ApplicationContext被创建完成后,程序后面获取singletion Bean实例将会拥有比较好的性能。ApplicationContext 包括BeanFactory的全部功能。
@Test
public void BeanFactoryTest(){
/* BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
beanFactory.getBean("date");
*/
//加载spring配置文件,多个Spring配置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
applicationContext.getBean("date");
}
BeanFactory对于某些内存非常关键的情景使用.
Bean使用
Spring可以看做一个超级大工厂,Spring 容器中的Bean就是该工厂的产品。
Spring框架主要做两件事:1.开发bean。2.配置bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成”依赖注入”——这就是所谓IOC的本质。
Bean的基本使用:
id:确实bean的唯一标识,容器对Bean的管理、访问、以及该Bean的依赖关系,都通过该属性完成。Bean的id在Spring容器中都是唯一的。
class: 指定Bean的具体实现类,不是接口。Spring必须知道创建Beand的实现类,而不是接口。在默认的设置中Spring会直接使用new 关键字创建该Bean的实例,所有必须提供Bean实现类的类名。
name:指定一个bean实例的标识名,表面将该Bean实例指定为别名。
alias:指定一个别名。
<!-- 给 person 设置多个别名 -->
<bean id="person" class="com.test.spring.model.Person" name="#aa,@123,abc">
</bean>
<!-- person设置一个别名 -->
<alias name="person" alias="per"/>
Bean的作用域
Single:单例模式,在Spting IoC容器中,Single作用域的Bean将只生产一个实例。
Prototype:多例模式,每次通过容器getBaen()获取的Bean都讲产生一个新的Bean实例。
request:对于一次Htttp请求,request 作用域 Bean将只生产一个实例,在同一次reqestHtttp请求会话中,程序每次得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才会真正的生效。
session: 对于一次会话,session作用域的Bean将只生成一个实例。
global:每个全局的HTTP Session 对于一个Bean实例。
当使用:single时:
@Test
public void BeanFactoryTest(){
/* BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
beanFactory.getBean("date");
*/
//加载spring配置文件,多个Spring配置
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml","bean.xml");
Person person1 = applicationContext.getBean("person",Person.class);
Person person2 = applicationContext.getBean("person",Person.class);
boolean b = person1 == person2;
System.out.println("对比person1与person2:"+b);
}
当时用Prototype时
Person person1 = applicationContext.getBean("person",Person.class);
Person person2 = applicationContext.getBean("person",Person.class);
boolean b = person1 == person2;
System.out.println("对比person1与person2:"+b);