1.what
1.1:管理javaBean——JavaBean的生成、关连(调用)、事务、安全性
1.2:Spring的核心是IoC,IoC的核心是容器,容器的核心是Java的反射机制。
2.Spring模块
2.1:AOP——Aspect-Oriented Programming
2.1.1:相关术语——Aspect、Joinpoint、Advice、Point cut、Instroduction、Target、Proxy、Weaving
2.1.2:配置文件书写顺序:目标对象、通知对象、关连2者、生成代理
2.1.3:应用——日志、事务
*应用中是通过代理的id来获得需要的bean的。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 织入——将切面应用到目标对象并创建代理对象的过程 --> <!-- 面包 即目标——被切入对象--> <bean id="snoopy" class="com.lovo.bean.Dog"> </bean> <!-- 切面——需要实现的交叉功能 --> <!-- 牛肉 即通知——切入点执行的切面代码--> <bean id="openMouseAdvice" class="com.lovo.advice.OpenMouseAdvice"> </bean> <bean id="closeMouseAdvice" class="com.lovo.advice.CloseMouseAdvice"> </bean> <!-- 刀功 即拦截器——将通知和目标相关联--> <bean id="openMouseInterceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <!-- 切入点——根据正则表达式匹配在那些地方开刀 --> <property name="pattern" value="com.lovo.bean.Dog.(bite|bark)"></property> <!-- 以上切入点所执行的通知 --> <property name="advice" ref="openMouseAdvice"></property><!-- 为了模块化,一个拦截器只配一个通知 --> </bean> <bean id="closeMouseInterceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="pattern" value="com.lovo.bean.Dog.bark"></property> <property name="advice" ref="closeMouseAdvice"></property> </bean> <!-- 汉堡 即代理--> <bean id="superSnoopy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="snoopy"></property> <property name="interceptorNames"> <list> <value>openMouseInterceptor</value> <value>closeMouseInterceptor</value> </list> </property> </bean> </beans>
2.2:
2.
3.相关技术
3.1:工厂模式
3.2:单例、单态
3.3:xml
3.4:反射
4.spring原理
1:配置文件载入容器
2:根据配置文件生成Bean对象
3:根据配置文件注入对象——给对象赋值
public class TestMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /** * ApplicationContext容器 */ // ApplicationContext contxt = new FileSystemXmlApplicationContext("src/applicationContext.xml"); ClassPathXmlApplicationContext contxt = new ClassPathXmlApplicationContext("applicationContext.xml"); Boy boy = (Boy)contxt.getBean("wxb");// System.out.println(boy.getName() + " " + boy.getAge()); contxt.destroy(); /** * BeanFactory容器 */ // Resource rs = new FileSystemResource("src/applicationContext.xml");//获得源文件 // BeanFactory bf = new XmlBeanFactory(rs);//【配置文件读入容器】 // Boy boy = (Boy)bf.getBean("wxb");//【通过反射机制根据配置文件生成Java对象;根据配置文件给对象值】 boy.kiss(); } }
4.IoC(inversion of control)=DC(dependence injection)
5.Spring容器类
5.1:区别和共同点【BeanFactory——ApplicationContext】
5.1.1:所有bean延迟加载,在调用getBean()方法时产生——预加载单态bean
5.1.2:AppliactionContext的功能更多
5.1.3:ApplicationContext有更多的载入方式
5.1.
5.1.
5.2:
5.
5.
5.
5.
6.Spring特点
6.1:默认情况下Bean都是singleton
6.2:轻量——7个组建可以根据情况选择性使用;开销小;非侵入式开发
6.3:依赖注入——对象用容器产生
6.4:容器
6.5:框架
7.配置文件 appliactioncontext
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!--【设置注入方式】 --> <beans> <!-- 『标识对象』id的值必须是唯一的,且满足Java命名规范 ;name——可以重复,任意命名--> <bean id="wxb" class="com.lovo.bean.Boy" singleton="false" init-method="born" destroy-method="die"> <!--singleton——用于设置bean对象是否是单例模式,默认情况下Spring的所有bean都是单态 --> <!--init-method,destroy-method——用于设置初始化对象和销毁对象;destroy-method标签只能在单态的时候才起作用,非单例用作用域来控制 --> <!--init和destroy也可以由Spring的类InitializingBean, DisposableBean的方法afterPropertiesSet/destroy来实现,不用配置标签属性 --> <!--设置对象的属性值 --> <property name="name"> <value>韦小宝</value> </property> <property name="age" value="18"></property> <!--可以用子标签也可以用属性,效果都一样 --> <property name="myGirl"> <bean class="com.lovo.bean.CuteGirl"/><!-- 只用一次的隐式对象 --> </property> <!--数组和List集合都采用List标签,set集合采用set标签 --> <property name="allWifeNames"> <list> <value>ake</value> <value>zr</value> <value>sq</value> </list> </property> <property name="allGirls"> <list> <ref bean="shuanger"/> <ref bean="jianning"/><!--引用数据类型用ref标签来接收值 --> <value>mjp</value><!-- 基本数据类型和String都用value接收值 --> </list> </property> <!-- map集合用entry标签来接受每个键值对--> <property name="myFriends"> <map> <entry key="1"><!--key标签的值只能是字符串 --> <value>chn</value> </entry> <entry key-ref="jianning"> <ref bean="shuanger"/> </entry> </map> </property> <!-- properties集合用props标签来装填元素prop--> <property name="myProperties"> <props> <prop key="11">由于property都是字符串,可以直接写值</prop> <prop key="33">好好学习</prop> </props> </property> </bean> </beans> <!--【构造器注入方式】 --> <beans> <bean id="wxb" class="com.lovo.bean.Boy"> <!-- index标签用于该变量在构造器形参中的位置--> <constructor-arg index="3"> <list> <value>ake</value> <value>zr</value> <value>sq</value> </list> </constructor-arg> <constructor-arg index="0" value="韦小宝"></constructor-arg> <constructor-arg index="1" value="23"></constructor-arg> <constructor-arg index="2" ref="shuanger"></constructor-arg> </bean> <bean id="wxb" class="com.lovo.bean.Boy"> <constructor-arg index="0" value="韦小宝"></constructor-arg> <!--type用于指定某个特定的类,区分父类和之类 --> <constructor-arg ref="shuanger" type="com.lovo.bean.CuteGirl"></constructor-arg> <property name="age" value="18"></property> </bean> <bean id="shuanger" class="com.lovo.bean.CuteGirl"></bean> <bean id="jianning" class="com.lovo.bean.RudeGirl"></bean> </beans>
8.注入方式
8.1:设置方式
8.2:构造器方式
8.3:应用
8.3.1:很多第三方数据库只调用午餐构造器,用设置方式。
8.3.2:给属性赋值的顺序要求固定时用构造器方式。
8.3.3:要求外部无法修改对象属性值时用构造器方式。