获取容器的三种方式
* 1 ClassPathXmlApplicationContext:默认去类路径下【src】加载该配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Book bean = context.getBean(Book.class); System.out.println(bean);
* 2 FileSystemXmlApplicationContext:默认去本地磁盘加载该配置文件
ApplicationContext context = new FileSystemXmlApplicationContext("E:\\develpment\\Eclipse\\spring01\\src\\applicationContext.xml"); Book bean = context.getBean(Book.class); System.out.println(bean);
* 3 xmlBeanFactory的方式
Resource resource = new FileSystemResource("E:\\develpment\\Eclipse\\spring01\\src\\applicationContext.xml"); XmlBeanFactory factory = new XmlBeanFactory(resource); Book bean = factory.getBean(Book.class); System.out.println(bean);
获取容器中bean对象的两种方式:
* 1.通过字节码方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Book bean = context.getBean(Book.class);
* 2.通过容器中bean对象的id或者name值的方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //applicationContext.xml中Book b = (Book)context.getBean("book");
两种方式的区别:
* 1.参数不同,一个参数是字节码,一个是字符串类型的id或name值
* 2.返回值也不相同,字节码类型的对象和Object类型的对象
* 3.参数如果是字节码:要求容器中有该类型的唯一bean对象,没有不行、两个及两个以上也不行
class="com.ujiuye.bean.Person"> class="com.ujiuye.bean.Person">
/*
报错信息:.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ujiuye.bean.Person] is defined:
expected single matching bean but found 2: person1,person2
*/
* 容器中bean对象的创建时机、底层原理、是否单例
* 1.创建时机: 默认是在容器加载的时候,容器中的bean对象按着从上到下的顺序依次被创建出来
@Test public void test01() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //容器一加载,通过反射创建类的对象,类的空参构造执行 public Book() { System.out.println("单例Book对象创建了");
* 2 底层原理:反射
* 3是否单例: 默认是单例的,如果想改成多例的,需要设置bean标签的scope属性值
*scope:
singleton:默认值,表示该对象是单例的,是随着容器的加载该bean对象被创建出来
出生:容器创建对象就出生了
活着:只要容器在,对象就一直在
死亡:容器销毁,对象消亡
(相对整个容器而言)
prototype:多例的,该对象是我们从容器中获取bean对象的时候才被创建,而不是随着容器的加载该对象被创建出来。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Book book1 = context.getBean(Book.class); public Book() { System.out.println("多例Book对象创建了");
出生:每次使用都会创建新对象
活着:只要对象在使用中就一直活着
死亡:当对象长时间不适用并且也没有别的对象引用时,由java的垃圾回收器回收.
(相对一个对象而言)
request:表示每个request请求都会创建一个新的bean对象
session:表示每个session会话都会创建一个新的bean对象
globalsession:表示一次全局会话会创建一个新的bean对象
Book book1 = context.getBean(Book.class); Book book2 = context.getBean(Book.class); System.out.println(book1==book2);
//单例时,返回的是true值:
//多例时:返回的是false值
设置scope属性
DI 全称:Dependency Injection:依赖注入,IOC是一种思想,DI是具体实现。
public class UserService { public void success() { System.out.println("service类的success方法成调用"); } }
public class UserServlet { private UserService userService; public void success() { userService.success(); }
}
public void setUserService(UserService userService) { this.userService = userService; }
class="com.offcn.bean.UserService"> class="com.offcn.bean.UserServlet">