Spring



 1.what

     1.1:管理javaBean——JavaBean的生成、关连(调用)、事务、安全性

     1.2:Spring的核心是IoC,IoC的核心是容器,容器的核心是Java的反射机制。

 

2.Spring模块

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:要求外部无法修改对象属性值时用构造器方式。

 

 

 

 

你可能感兴趣的:(spring,AOP,bean,配置管理,IOC)