一. 三种思想(Ioc,DI,AOP)
Ioc
inversion of control,控制反转,强调的是原来在程序中创建bean的权利反转给第三方。
DI
depency injection,依赖注入,强调的是bean之间的关系,由第三方负责设置。
AOP
aspect oriented programming,面向切面编程,功能的横向抽取,主要的实现方式就是Proxy。
这里一直都在提到bean,那么bean到底指的是什么,它和我们之前学的Javabean又有什么区别呢?
在Spring官方文档中对Bean的解释如下:
In Spring, the objects that form the backbone of your application and that are managed by the Spring loC container are called beans. A bean
is an object that is instantiated.
assembled. and otherwise managed by a Spring IoC container
译文:
在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean,bean是一个由Spring IoC容器实例化、组装和管理的对象。
简单来说,spring bean是由Spring Ioc容器自动管理的对象。
而java bean是符合java 规范的一种特殊类,提供get,set,hashcode,toString等方法,它需要手动创建和控制。
二. beanFactory获取bean对象
为了易于开发和维护,当我们想获取bean对象时,通常由第三方来控制,也就是这里的beanFactory,实现IOC和DI思想。
步骤如下:
1.创建maven工程,引入Spring.context依赖。
Spring.context依赖:maven官网上这样说:Spring 上下文。“Spring Context 提供对已配置对象的访问,例如注册表(上下文)。 它从 Spring Beans 继承了其功能,并增加了对国际化、事件传播、资源加载和上下文透明创建的支持。”
2.创建Service接口及其实现类ServiceImpl(及一个涉及UserDao的方法),和UserDao接口和实现。(Bean),这里创建俩个bean,为了展示一下如何配置xml文件来让beanFactory处理他们之间的联系。也就是DI。
3.创建xml配置文件,如bean.xml。(取名随意)
这个文件就是专门用来配置Javabean的,以后我们需要用到什么就找beanFactory要,而beanFactory就从配置里找来用。
4.创建text类来实现
具体实现如下:
关于配置文件
<?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">
//name="userDao",这里引用的是UserDao接口实现类中的方法setUserDao,要求u小写
//而ref="UserDao"指的是id="UserDao"中的UserDao,这样就绑定了UserDao接口实现
<bean id="Service" class="com.demo.impl.ServiceImpl">
<property name="userDao" ref="UserDao"></property>
</bean>
<bean id="UserDao" class="com.demo.impl.UserDaoImpl"></bean>
</beans>
ServiceImpl中的方法
package com.demo.impl;
import com.demo.Service;
import com.demo.UserDao;
public class ServiceImpl implements Service {
public void setUserDao(UserDao userDao){
System.out.println("beanFactory调用该方法,从bean中获取设置到这里"+userDao);
}
}
关于text类,即工厂来控制创建实例对象
import com.demo.Service;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
public class beanFactoryText {
public static void main(String[] args) {
//创建工厂对象
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//创建读取器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
//读取配置文件给工厂
reader.loadBeanDefinitions("bean.xml");
//根据id获取bean实例对象
ServiceImpl serviceimpl = (ServiceImpl) beanFactory.getBean("Service");
UserDaoImpl UserDaoimpl = (UserDaoImpl) beanFactory.getBean("UserDao");
//查看是否创建成功
System.out.println(serviceimpl);
System.out.println(UserDaoimpl);
System.out.println("---------");
//根据id获取bean实例对象
Service service = (Service) beanFactory.getBean("Service");
UserDao UserDao = (UserDao) beanFactory.getBean("UserDao");
//查看是否创建成功
System.out.println(service);
System.out.println(UserDao);
}
}
输出结果
哎我们发现,为什么创建的明明是两对不一样的实例对象,为什么返回的地址却对应相等呢?而又为什么只输出了一回“beanFactory调用该方法........”呢?
在我的理解下,应该是这样:
1.在我们进行配置bean的时候,”class“就指明了创建的实例对象的类型。
剩下一个问题呢,求问大佬解答,小白现在也不懂为什么。。
------------分割线啦-------------------
哦,有大佬讲到了一个新名词,单例模式。
就是说,“Spring的bean默认是单例模式,可以通过scope作用域去配置。”
什么是Spring的bean单例模式?
1.一个类只能有一个实例
2.这个实例自己创建
3.整个系统都用这个实例
这样我们就知道了哦我们只能创建一个实例对象,调用其接口方法。再创建的话就无法实现。
更多关于单例模式的知识,写另外一个笔记上。
欧克,那我们这样就大概了解了IOC和DI的思想是如何体现的。
标签:UserDao,Service,DI,Spring,beanFactory,BeanFactery,bean,创建,IOC From: https://blog.csdn.net/Ggjvhsjsj/article/details/142570293