spring

spring框架的定义:
		是一个开源的用来简化应用开发的框架

		优点:简化开发 -->spring jdbc、管理对象 -->spring容器、集成其他框架
		
启动spring容器:
	1.建项目,导包 pom.xml里搜spring-webmvc  > org.springframework spring-webmvc >3.2.8

	2.添加配置文件:spring-webmvc.xml

	3.启动spring容器
		ApplicationContext ac =
				new ClassPathXmlApplicationContext("applicationContext.xml");
		
创建对象:
	方式一:使用无参构造器
			1.给类添加无参构造(默认的就行)		
			2.配置<bean>元素
			3.调用容器的getBean方法获取对象,参数id

	方式二:使用静态工厂方式创建对象
			通过调用类的静态方法来创建对象
			factory-method属性:指定一个静态方法
	方式三:使用实例工厂方法创建对象
			通过调用对象的实例方法来创建对象
		factory-bean属性:指定一个bean的id
		factory-method属性:指定一个方法
		spring容器会调用bean的对应方法来创建对象

作用域:
	scope属性值为:prototype,就可以创建多个对象
	               singleton(单例模式)(默认值)只创建一个对象
		
声明周期:
	创建》
	初始化》init-method属性  创建之后立即调用
	功能》
	销毁》destroy-method属性   关闭容器的时候会先销毁对象,只有作用域为单例时才会执行

延迟加载:
	spring容器启动后,会将所有作用域为单例的bean创建好	
	lazy-init属性:延迟加载
			true:创建对象时不调用初始化方法


IOC(Incersion Of Controll 控制反转)
	1,IOC定义:对象之间的依赖关系有容器来建立

	2. DI定义:(Dependency Injection 依赖注入)
		    通过调用对象提供的set方法或构造器来建立依赖关系
	
	IOC是目标,DI是手段

	3.set 方法注入
		配置文件添加bean的子标签<property>它的属性name值是变量名
		 ref值是被注入bean 的id

	4。 构造器方法注入
		添加相应的构造器,配置 <constructor-arg> index 属性指定下标0开始 ref同上


	5.自动注入(自动装配)@Autowired
	      spring容器依据某种规则,自动建立对象之间的依赖关系
		a.默认情况下,不会自动装配;
		b.可以指定autowire属性来告诉容器自动装配(set方法或构造器)
		 autowire属性值:byName容器依据属性名查找对应的bean调用set注入,找不到为null
				 byType容器依据属性类型 ,找到多个会保错      
				 constructor 与byType类似,不同的是调用构造器来完成注入

	6.注入基本类型的值  》value

		<bean id="vb1" class="values.ValueBean">
			<property name="name" value="胡八一"></property>
			<property name="age" value="30"></property>
		</bean>

	7.注入集合类型的值  》List 、Set、Map、Properties
		
			<property name="city" >
				<list>
					<value>北京</value>
					<value>上海</value>
					<value>广州</value>
					<value>重庆</value>
				</list>
			</property>

		<property name="interest">
			<set>
				<value>放屁</value>
				<value>拉屎</value>
			</set>
		</property>
		
		<property name="score">
			<map>
				<entry key="english" value="60"/>
				<entry key="math" value="80"/>
				<entry key="生物" value="90"/>
			</map>
		</property>
		
		<property name="db">
			<props>
				<prop key="用户名">刘俊哲</prop>
				<prop key="密码">123456</prop>
			</props>
		</property>

	8.引入的方式注入集合类型的值
		<util:list id="cityBean">
			<value>上海</value>
			<value>重庆</value>
		</util:list>
		<bean id="vb2" class="values.ValueBean">
			<property name="city" ref="cityBean"></property>
		</bean>
		
	9.读取properties文件内容
		读取properties文件的内容
		classpath:按照类路径来搜索
		location="classpath:****.properties"
		spring 容器会依据路径找到文件读取
		<util:properties id="config" location="classpath:config.properties"/>
	
	10.使用spring表达式 #{ }
		<property name="name" value="#{vb2.name}"></property>
		<property name="city" value="#{vb2.city[1]}"></property> :List
		<property name="score" value="#{vb2.score['英语']}"></property>  :map
		<property name="pageSize" value="#{config.pagesize}"></property>  :properties文件中的key
	
		
使用注解简化配置

	1.组件扫描   >  spring容器会扫描该包及其子包下的所有类如有注解则将其纳入管理(相当于bean)
		1>在类前添加注解 @Component("sb1") bean   缺省情况类名首字母小写
				 @Scope("prototype")指定作用域	值换成singleton则单例
		2> xml文件中配置 >   <context:component-scan base-package="annotation"/>
				     base-package属性:指定要扫描的包名
		
		
		注解:
			@Component 通用注解
			@Named 通用注解
			@Reposotory 持久化组件注解
			@Service 业务层组件注解
			@Controller控制层组件注解

		特殊注解:
			 @PostConstruct 初始化注解
			 @PreDestroy 销毁注解
			 @lazy 延迟加载
			 @Scope作用域



依赖注入相关的注解

	@Autowired 和 @Qualifier   支持set方式注入和构造器方式注入
		1》当采用set方式注入时,将@Autowited添加到set方法前面,不使用@Qualifier的话将使用byType方式
			建议使用 @Qualifier 注明要注入的对象名

			@Autowired
			public void setWt(@Qualifier("wt")Waiter wt) {
				System.out.println("setWt()");
				this.wt = wt;
			}
		2》注解加到属性前


	@inject /  @Named   与上面一致
	
	@Resource    只支持set方法注入    
		     可以添加到set方法前,使用name属性指定要注入的bean的id(否则btType方式)也可以添加到属性前
							
		@Resource(name="wt")
		public void setWt(Waiter wt) {
			System.out.println("setWt(wt)");
			this.wt = wt;
		}


	@Value注解
		可以注入基本类型的值 也可以使用spring表达式 ,加到属性前或加到set方法前




测试方法 :junit.jar
	

AOP  :面向切面(儿) 编程   -->性能审计,异常跟踪,事物处理。
	java.long.refl
	定义:一个事物的横切面
	    面向切面编程可以在不改变原有软件的逻辑情况下,为软件添加扩展功能。

	1.导包  aspectj aspectjweaver   >1.5.4 jar
		注:也需要导入spring—aop组件
	2.配置文件  spring-aop.xml
		<!-- 组件扫描@Componment -->
		<context:component-scan base-package="cn.tedu.note.aop"/>
		<!-- aspectj 支持@Aspect注解 -->
		<aop:aspectj-autoproxy/>
	3.在cn.tedu.note.aop包里建java类 类前加注解 @Component    @Aspect  表示切面
	4.方法前加  @Before("bean(userService)")  > org.aspectj.lang.annotation.Before;
			切面切人位置为userService的所有方法之前


通知:
	声明切面方法的切人位置,相对于被拦截方法的前后位置。
	1》@Before 在被拦截的方法之前执行
	2》@AfterReturning 在别拦截的方法正常结束后执行
	3》@AfterThrowing 在被拦截的方法异常结束时执行
	4》@After 在被拦截的方法最终结束后执行,跟异常没关系

	5》@Around 环绕通知 可以在底层方法之前和之后
		Object obj=joinPoint.proceed();//调用底层业务方法
		Signature s=joinPoint.getSignature();//获取方法签名


切入点:
	execution : 方法级切入:可以切入到具体方法上
		execution(返回值 包名.类名.方法名(参数))  :参数:".." ,返回值:"*",
	within  : 类级别切入按照类型切入
		within(类名表达式)  --》cn.tedu.note.aop.PointCutDemo
	bean组件切入:切入到bean所有方法
		bean(bean组件id)

spring AOP
	AspectJ -->Proxy :有接口时反射API的动态代理Proxy
		-->CGLIB : 没有接口时使用CGLIB

	spring AOP的底层是  基于(JDK反射的)动态代理实现的

案例: 利用一个文件保存所有业务方法的性能(执行消耗时间)
	利用AOP拦截所有业务请求
	@Around("bena(*Service)")


# spring 事物处理(交易处理)
	编码式事物处理:acid四个特性  原子性、一致性、隔离性、持久性 
	声明式事物处理:无需编码,只需要使用注解声明事物的边界即可。
	1.配置文件   必须有spring-jdbc包
		<!-- spring配置文件 -->
		<!-- 配置声明式事物处理 -->
		<!-- 配置事物管理器 -->
		<bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
			<property name="dataSource" ref="dataSource"/>
		</bean>
		<!-- 用于驱动@Transactional注解 -->
		<tx:annotation-driven transaction-manager="txManger"/>

	2. 在方法前添加注解@Transactional(readOnly=true): 只读方法前添加

事务的传播 > @Transactional(propagation=Propagation.REQUIRED)
	默认情况下,事务会自动传播:在一个事务方法中调用另一个事务方法,
	则自动结合为一个事务!
	Propagation.REQUIRED:如果有事务,参与到当前事务,没有的话开启新事务
	Propagation.REQUIRES_NEW:必须创建新事务,如果有事务则挂起,开启新事务
	Propagation.NEVER :绝不,方法从不参与事务
	propagation.NESTED :嵌套,事务必须嵌套到其他事务中
	propagation.MANDATORY :不能参与事务,在事务中异常
	propagation.SUPPORTED :不支持,可以在事务中调用,但是不参与不支持事务 
	propagation.SUPPORTS:支持事务,可以在事务中调用,但是单独调用,没有事务保护

事务隔离属性  > @Transactional(isolation=Isolation.SERIALIZABLE)
	在软件中大多采用Isolation.READ_COMMITTED 事务隔离级别,可以在并发性能和
	隔离安全性之间平衡,是最常用的隔离级别;
	Isolation.SERIALIZABLE 是完全串行操作,没有并发,安全性好
	Isolation.READ_UNCOMMITTED 完全不隔离,可以完全并发操作,并发性能好,数据安全型差
	
最佳实践:
	1.在业务方法上都使用事务注解
		事务注解可以写到类上,这个类方法全部支持事务
	2.使用默认的传播属性
	3.使用默认的隔离级别
	4.对于只读的方法,使用 readOnly=true

》MySQL:MyISAM数据库引擎不支持事务,InnoDB引擎支持数据库事务


初始化spring容器 
	两种方法:1.DispatchServlet
			--只使用spring mvc,则DispatchServlet即可。
		  2.ContextLoaderListener
			--其他情况,就需要使用ContextLoaderListener
如何获取spring bean对象
	1.注入bean:当前bean被spring管理的情况下可以使用注入
	2.getBean: 当前对象不被spring管理,则需要getBean
	WebApplicationContext ctx=
		WebApplicationContextUtils.getRequiredWebApplicationContext(cfg.getServletContext());


都是切面编程
	spring mvc拦截器
		--拦截spring mvc的web url请求
	servlet filter
		--可以拦截任何的web url 请求
			-*.jsp ,*.css,*.html ,*.js,*.png
			如:登录以后才能查看图片(防盗链)
	spring AOP
		--拦截对业务层或数据层的请求的

  

原文地址:https://www.cnblogs.com/liujunzhe/p/8445119.html