Spring IOC
概念:
-
spring框架两大理念:IOC和AOP。具有低侵入低耦合,声明了事务管理,方便集成其他框架,降低开发难度等优点。
-
AOP:将核心业务功能和周边功能区分,使周边功能独立出来减少代码重复率和降低模块耦合度,并且具有较高的扩展性(权限控制,日志管理,事务管理等)
-
IOC(inverse of controller):翻转控制,简单的说就是将程序中手动创建对象的权利交给Spring框架
另一种描述:依赖注入DI,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。同一件事情的不同角度的描述,根本上就是引入IOC容器,利用依赖关系向容器里放Bean,实现对象间的解耦。
- 好莱坞原则:不要打电话给我,我们会打电话给你。
拓:在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。
- 好处:对象之间解耦;不需要理解类的具体实现,直接去ioc容器里面拿就好了
思考设计:
1.定义一个与配置文件对应的类bean
2.定义bean工厂接口及其实现类,解析配置文件,实例化
将实例化对象放到list中,再用一个map做注册,实现getBean()
3.实现获取Bean方法
- 需要两个依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
-
配置文件以及相应的bean
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id="userDao" class="org.example.dao.UserDao"></bean>> <bean id="userService" class="org.example.service.UserService"></bean> </beans>
public class MyBean { private String id; private String clazz; //Constructor.. //set get.. }
-
工厂接口以及相应的实现类
public interface BeanFactory {
public Object getBean(String id);
}
public class MyClassPathXmlApplicationContext implements BeanFactory{
private List<MyBean> beanList;
private Map<String,Object> beanMap=new HashMap<>();
public MyClassPathXmlApplicationContext(String filename){
this.parseXml(filename);
this.instanceBean();
}
//解析配置文件得到List集合
private void parseXml(String filename){
//dom4j:获取解析器
SAXReader saxReader = new SAXReader();
URL resource = this.getClass().getClassLoader().getResource(filename);
try{
Document document = saxReader.read(resource);
//xpath语法:获取beans下的所有bean
XPath xPath = document.createXPath("beans/bean");
//通过制定的格式解析文档对象
List<Element> list = xPath.selectNodes(document);
if(list!=null&&list.size()>0){
beanList = new ArrayList<>();
for(Element el:list){
String id = el.attributeValue("id");
String clazz = el.attributeValue("class");
MyBean myBean = new MyBean(id, clazz);
beanList.add(myBean);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
private void instanceBean(){
if(beanList!=null&&beanList.size()>0){
for(MyBean bean:beanList){
String id=bean.getId();
String clazz=bean.getClazz();
try{
Object o = Class.forName(clazz).newInstance();
beanMap.put(id,o);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
@Override
public Object getBean(String id) {
Object o = beanMap.get(id);
return o;
}
}
- 测试
public class App
{
public static void main( String[] args )
{
BeanFactory beanFactory = new MyClassPathXmlApplicationContext("spring.xml");
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
userDao.test();
UserService userService = (UserService) beanFactory.getBean("userService");
userService.test();
}
}