Spring简介
spring是一个从实际开发中抽取出来的框架,为企业开发提供一个轻量级的解决方案。解决方案包括了:基于依赖注入(Dependency Injection)的核心机制、基于AOP(面向切面编程)的声明式事务管理、与多种持久层计数的整合,以及优秀的WEB MVC框架等。
Spring的有点是:
低侵入式设计
IOC容器降低业务对象替换的复杂性
Spring的ORM(对象关系映射)和DAO提供良好的整合,简化底层数据库的访问。
使用Spring来管理bean
//axe类
public class Axe {
public String chop(){
return "使用斧头砍柴";
}
}
//person类
public class Person {
private Axe axe;
public void setAxe(Axe axe){
this.axe = axe;
}
public void useAxe(){
System.out.println("我打算去砍点柴");
//调用axe的hop方法
//表名person依赖与axe对象
System.out.println(axe.chop());
}
}
<!--beans.xml的配置-->
<?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 id="person" class="org.crazyit.app.service.Person">
<property name="axe" ref="axe"/>
</bean>
<bean id="axe" class="org.crazyit.app.service.Axe"/>
<bean id="win" class="javax.swing.JFrame"/>
<bean id="date" class="java.util.Date"/>
</beans>
配置文件中的<bean>
元素默认以反射方式来调用该类无参数的构造器
<bean id="person" class="org.crazyit.app.service.Person"/>
//Spring底层会执行以下格式代码
String idStr="person";//解析<bean../>元素的id属性得到该字符串值
String classStr="org.crazyit.app.service.Person";//解析<bean../>元素class属性得到该字符串值
Class clazz = Class.forName(classStr);
Object obj = clazz.newIntance();//创建一个实例
container.put(idStr,obj);//container代表Spring容器
class属性必须是完整的包名
Spring框架只要看到有<property.. />
元素,那么就会在底层以反射的方式执行一次setter方法。
=》<bean>
Spring调用构造器创建对象 <property>
驱动Spring执行setter方法
<bean id="person" class="org.crazyit.app.service.Person">
<!--控制调用setAxe()方法,将容器里的axe Bean作为参数传入-->
<property name="axe" ref="axe">
</bean>
//name属性驱动Spring执行setAxe()方法,ref为axe,指定容器中名为axe的Bean作为setter方法传入参数
//底层执行如下代码
String nameStr="axe";//解析<property>元素的name属性
String refStr="axe";//解析<property>元素的axe属性
String setterName="set"+nameStr.substring(0,1).toUpperCase()+nameStr.subString()+nameStr.subString(1);//生成将要setter方法名
//获取Spring容器名为refStr的Bean
Object paramBean=container.get(refStr);
//clazz是前一段得到的Class对象
Method setter=clazz.getMethod(setterName,paramBean.getClass());
setter.invoke(obj,paramBean);
创建spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("xx.xml");
spring核心机制:依赖注入
控制反转(Inversion of Control,Ioc)和依赖注入(Dependency Injection)含义相同
调用者无须主动获取被依赖对象,只要被动接受Spring容器为调用者的成员变量赋值即可。调用者从主动的获取(new)变成被动接受(property)——控制反转。
Spring容器将被依赖对象赋值给调用者的成员变量——依赖注入
1.设值注入 2.构造注入
Spring加载resource时的classpath*与classpath
classpath*为了从多个jar文件中加载相同的文件
classpath:只能加载找到的第一个文件
如果resource1.jar中package中一个1.xml,resource2.jar中有一个1.xml,那么classpath*会将这两个xml全部加载,classpath只会加载其中的一个(顺序取决于jar包的加载顺序)