对spring的小理解
Spring
一、ioc控制反转
当前比较流行的实现方式是依赖注入,即程序运行过程中,程序代码不做定位查询,由容器自动进行。
在Spring框架中java对象被称为bean。Spring使用“依赖注入”的方式来管理bean之间的关系,使用ioc来实现对象之间的解耦合。
二、基础使用步骤
1)创建maven项目
2)加入maven依赖(spring-context)
3)定义接口及实现类
4) 创建Spring配置文件
5)指定Spring配置文件的位置和名称--创建Spring容器对象ApplicationContext ac=new ClassPathXmlApplicationContext()--从容器中获取对象(ac.getBean())--执行对象的业务方法
注:1、若Spring配置文件在项目的类路径下(target--》classes),则使用ClassPathXMlApplicationContext实现类进行加载。2、ApplicationContext容器中对象的装配时机是在容器对象初始化时一次性将所有的对象装配好,再使用是可直接从内存中获取。
三、注入分类
诸如分为两种 set注入以及构造注入
set注入:
需要被注入的类实现set方法,在Spring配置文件中的基本格式是
<bean id=" 自定义的名字" class="要创建的类">
<property name="要注入的属性名" value="要赋的值">(value是在属性类型为八种基本数据类型加上String类型之中的类型时使用)
<property name="要注入的属性名" ref="bean的id">(ref是在属性是另一个实例时,通过 ref 指定它们间的引用关系,)
</bean>
构造注入:
使用类的有参构造函数创建对象,与set注入略有不同
<bean id=" 自定义的名字" class="要创建的类">
<constructor-arg name="要注入的属性名" value="要赋的值">
<constructor-arg name="要注入的属性名" ref="bean的id">
<constructor-arg name="要注入的属性名" index="指明该参数对应着构造器的第几个参数,从0开始">
</bean>
注:可以自动给引用类型辅助,使用autowired
<bean id=" 自定义的名字" class="要创建的类" autowired="byName/byType">
byName:容器是通过调用者的bean类的属性名与配置文件的被调用者bean的id进行比较而实现自动注入的
byType:容器是通过调用者bean类的属性类型与配置文件的被调用者bean的类型进行比较(即要么相同,要么是子类或者实现类)而实现自动注入的
四、多个Spring配置文件的配置
在主配置文件中的语句是<import resource="classpath:"/>
<import resource="classpath:"/>
注:1、为多个配置文件指定路径时必须是在子包下,并且与其处于同一目录时才能正常运行。
2、主配置文件一般不定义对象
五、注解
使用注解之后,我们就不必在配置文件中声明bean实例,但需要在原有配置文件上加上组件扫描器,用于在指定的基本包中扫描注解
1、<context:component-scan base-package="要扫描的包名,要扫描的包名;要扫描的包名"/>(包名可以是父类,但不建议太模糊,会扫描多个包降低运行速度)
2、@component
需要在类上使用注解@Component,该注解的 value 属性用于指定该 bean 的 id 值,用注解进行赋值时类中不需要有set方法。
属性注入:@value用来对简单类型进行赋值,@Autowired用来对引用属性进行赋值,@Autowired自动使用byType类型注入,如果要使用byName的话需要在其基础上加上@Qualifier("id值"),@AUtowired还有一个属性required,默认为true,表示当匹配失败后会终止程序运行,若设为false则会自动忽略未被匹配的引用,为其赋值为null。
3.@Resource自动注入(为引用赋值)
该注解不带任何参数,默认按名称的方式注入,按名称不能注入bean则按类型进行注入。
六、AOP
1)Aop,面向切面编程。其底层采用动态代理实现,采用了两种代理,JDK的动态代理和CGLIB的动态代理。
面向切面编程就是将业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与业务逻辑无关的代码,如安全检查,事务,日志,缓存等。若不使用AOP将交叉业务逻辑与主业务逻辑分开,那么就会降低代码的可读性,干扰业务逻辑,使得耦合度提升,开发效率降低。
2)AOP术语
切面:泛指交叉业务逻辑,常用的切面是通知
连接点:指可以被切面植入的具体方法。通常业务接口中的方法均为连接点。
切入点:指一个或多个连接点的集合,通过切入点指定一组方法。
目标对象:指要被增强的对象。即包含主业务逻辑的类的对象
通知:表示切面的执行时间。是在目标方法之前还是之后执行。
注:切入点定义切入的位置,通知定义切入的时间。
3)在Spring开发中一般使用Aspectj的方式实现AOP编程思想。
4)切入点表达式 execution(访问权限 方法返回值,方法声明(参数) 异常类型)
其中方法返回值、方法声明必须写。
5)切入点表达式具体符号:

6)所需的maven依赖
除了最基本的spring-context,还有spring-aspects
7)spring实现aop基本步骤:
1.定义接口和实现类2.定义切面类(在类上加@Aspect)3.声明目标对象以及切面类对象(在spring配置文件种用bean生命)4.注册AsepctJ的自动代理<aop:aspectj-autoproxy/>
8)@Before前置通知方法(方法有joinPoint参数,可通过他获取切入点表达式,方法签名,目标对象等):
9)@AfterReturing后置通知-注解有returning属性,用于接收目标方法的返回值
10)@Around环绕通知-增强方法有ProceedingJoinPoint参数,他有一个proceed()方法,用于执行目标方法。
11)@After最终通知-总会执行
12)@Pointcut定义切入点
@Poincut(value="excution()") 写在方法上,该方法无需代码,即可在其他目标方法上使用该方法名字来代表切入点表达式
七、Spring集成MyBatis
1)需要导入的maven依赖有spring-context,spring-tx,spring-jdbc,mybatis,mybatis-spring,mysql,druid
2)Mybatis文件配置:mybatis主配置文件中不再需要数据源的配置。因为数据源要交给Spring容器来管理了
3)Spring配置文件:
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<bean id="myDatasource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDatasource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.bjpowernode.dao"/>
</bean>
<bean id="studentService" class="com.bjpowernode.service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao"/>
</bean>
从上往下依次是定义jdbc.properties位置的注册,Druid数据库的配置,SqlSessionFactoryBean的配置,mybatis的配置,dao接口的创建,业务实现类的创建。
八、Spring的事务管理
1)事物的隔离级别:有四个值,默认是DEFAULT
READ_UNCOMMITED:读未提交。未解决任何并发问题
READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读
REPEATABLE_READ:可重复读。解决脏读,不可重复读,存在幻读。
SERIALIZABLE:串行化。不存在并发问题。
2)事务传播行为常量
PROPAGATION_REQUIRED:指定的方法必须在事务内执行。若存在当前事务,九加入到当前事务中;若当前不存在事务,则创建一个新事务,是spring默认的传播行为。
PROPAGATION_REQUIRES_NEW
指定的方法支持当前事务,但若当前方法没有事务,也可以以非事务方式执行
PROPAGATION_SUPPORTS
总是新建一个事务,若存在当前事务,九江当前事务挂起,直到新事物执行完毕
3) 在Spring中如何使用事务?
1.声明事务管理器DataSourceTransactionManager
2.开启注解驱动<tx:annotation-driven transaction-manager="上面声明的事务管理器"/>

3.在业务层public方法加入事务属性Transactional
4)使用Aspectj的aop配置管理事务
1.额外加入spring-aspects依赖
2.声明事务管理器
3.
九、监听器
在web项目中我们创建容器对象的代码不能在方法里,如果这样的话每次执行都会重新创建,又耗时又废内存。我们应该加创建好的spring容器以属性的形式放入ServletContext的空间中,就抱着了Spring容器的全局性。
1)注册监听器ContextLoaderListener
2)指定Spring配置文件的位置<context-param>

3)获取Spring容器对象的两种方式


浙公网安备 33010602011771号