zoukankan      html  css  js  c++  java
  • 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
    		--拦截对业务层或数据层的请求的
    

      

  • 相关阅读:
    关键字驱动测试方法
    File文件操作
    问题处理:类没有复制构造函数
    QTP问题修改:This run was performed on Internet Explorer 7.x without the required 'Enable Tabbed Browsing
    QTP:.net中写文件
    bat垃圾清理
    Lua安装与使用
    QTP:Flight账号及密码
    如何在VS2010中运行控制台程序时停留在控制台显示窗口
    QTP中Screen Recorder无内容,no movie is associated with the results.
  • 原文地址:https://www.cnblogs.com/liujunzhe/p/8445119.html
Copyright © 2011-2022 走看看