为什么用Spring框架:
Spring的作用是被标榜为程序之间的解耦,spring能降低不同模块之间的耦合度,原因就是在程序开发里不同模块之间信息的沟通是通过对象传递完成的,而对象能否顺利传递就是要合理的构建好对象,而管理好对象的构建方式就能管理好对象传递,这就是spring给系统架构设计带来的好处。
引入依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
</dependencies>
创建Spring的配置文件
<?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">
<bean class="cn.wd.UserDao2" id="userDao"/>
<bean class="cn.wd.StudentDao" id="student"/>
</beans>
Spring的IoC的底层实现原理
这里先给出结论:Spring的IoC的底层实现原理是工厂设计模式+反射+XML配置文件。 就拿持久层(也即dao层,data access object,数据访问对象)的开发来说,官方推荐做法是先创建一个接口,然后再创建接口对应的实现类。所以,这里,我会以dao层的开发为例来证明Spring的IoC的底层实现原理就是工厂设计模式+反射+XML配置文件。
首先,创建一个Userdao接口。
我们要创建个UserDao
\
另外:
public static void main(String[] args) {
//读取配置文件
ClassPathResource resource = new ClassPathResource("application.xml");
//解析配置文件
XmlBeanFactory factory = new XmlBeanFactory(resource);
Object userDao = factory.getBean("userDao2"); //拿到哪个bean时才会调用构造函数创建该bean.
//当使用到bean对象时,spring才会帮你创建.
Object people = factory.getBean("people");
}
public static void main(String[] args) {
//在加载spring容器时,spring会把配置文件中所有的bean创建好。
ApplicationContext app=new ClassPathXmlApplicationContext("application.xml");
IUserDao userDao = (IUserDao) app.getBean("userDao2");
userDao.show();
}
测试:
只要在application.xml 里面配合过的
Spring中 BeanFactory和ApplicationContext的区别
BeanFactory 才是 Spring 容器中的顶层接口。
ApplicationContext 是它的子接口。
单例模式下创建对象的时间点不一样:
ApplicationContext:(饿汉模式)只要一读取配置文件,马上就会创建配置文件中配置的对象。
BeanFactory:(懒汉模式)什么时候getBean("id"),也就是说当根据id获取对象时,才会创建。
过去bean的方式
1) 通过bean.xml文件中bean标签的id的值获取bean(使用默认构造方法)
IUserDao iUserDao= (IUserDao) app.getBean("userDao");
2)通过类型去获取
IUserDao userDao = app.getBean(IUserDao.class);
确保bean的类型是唯一的 不然会报错:
org.springframework.beans.factory.NoUniqueBeanDefinitionException
C 通过 id + 类型去获取
3)通过 id + 类型去获取
IUserDao userDao = app.getBean("userDao2", IUserDao.class);