Spring入门
传统Javaweb存在的问题
- 层与层之间紧密耦合,接口和具体实现之间紧密耦合。(通过BeanFactory进行管理)
- 通用的功能耦合在业务代码中。就比如说接入数据库、记录日志等。(AOP,增强Bean对象的功能)
IoC、DI、AOP思想
IoC控制反转
指原来在程序中船舰Bean的权利反转给第三方
DI注入依赖
强调Bean之间的关系,这种关系第三方负责设置。例如Bean1的产生依赖于Bean2的存在
AOP切面编程
主要实现就是Proxy,对某一个Bean进行功能增强
BeanFactory
通过配置清单构建各种Bean类
-
需要导入Spring-context包
-
创建对应的Bean类以及相应的xml配置文件
-
测试Bean的创建是否成功
public static void main(String[] args) { // 创建工厂对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 创建一个读取器(xml文件) XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); // 读取配置文件给工厂 reader.loadBeanDefinitions("beans.xml"); // 原本返回的是一个Object对象 UserService userService = (UserService) beanFactory.getBean("userService"); System.out.println(userService); }
数据传入
在配置文件中设置property
实现参数的传入,这也就是控制反转。
<bean id="userService" class="com.itheima.service.impl.UserServiceimpl">
<!-- 将userDao传入到setUserDao方法中 注意这边使用的是ref标签 -->
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.itheima.service.dao.impl.UserDaoImpl"/>
Java中类代码
private UserDao userDao;
// 该方法由BeanFactory进行调用,从容器中获取UserDao设置到此位置
public void setUserDao(UserDao userDao){
System.out.println("BeanFactory executing: " + userDao);
this.userDao = userDao;
}
BeanFactory和ApplicationContext之间的关系
BeanFactory:
- Spring早期接口,Bean工厂
- 更偏向于底层
- 在首次getBean的时候才进行Bean创建,有点像延迟加载
ApplicationContext:
- Spring后期更高级的接口,Spring容器
- 继承了BeanFactory接口,并且内部维护了BeanFactory的功能
- 在加载配置文件过程中,就创建了所有的Bean实例对象
常用的ApplicationContext的三个作用
- ClassPathXmlApplicationContext:加载类路径下的xml配置的ApplicationContext
- FileSystemXmlApplicationContext:加载磁盘路径下的xml配置的ApplicationContext
- AnnotationConfigApplicationContext:加载注解配置类的ApplicationContext