Spring

spring在接管数据源的时候,在引入外部properties的时候,${username}取出来的名字是系统的用户的名字

IOC

Scope:指定bean的作用域
单例
多例
同一次请求创建一个
同一次会话创建一个

//创建容器对象,applicationContext.xml是spring的配置文件,里面配置了各种bean,比如数据源,扫描Dao包之类的
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean,因为Dao是通过的扫描包形式由spring接管的,所以它在spring容器中的名字是类名第一个字母小写的名字,后面这个参数是指定参数
SignDao signDao = ioc.getBean("signDao", SignDao.class);

spring工厂
只要实现了FactoryBean接口的类都会被spring认定是一个工厂类,在spring中注册,就会去造对应的类的对象,并且只是在获取的时候才创建

生命周期的bean
创建有生命周期的bean,可以自定义初始化方法和销毁方法,多实例没有销毁方法

后置处理器
后置处理器 分为前后处理,后置处理器before-初始化方法-购置处理器after

泛型依赖注入
写个带有泛型的接口BaseDao< T>,接口里面写要实现这个接口的方法,然后BookDao和UserDao去实现这个接口,泛型类型也需要指定具体类型,给方法写方法体,然后在创建一个BaseService< T>的类,其中有属性叫BaseDao< T> baseDao属性,自动注入,BaseService< T>这个类上并没有加注解,所以这个类并没有被spring接管。然后用BookService和UserService去继承BaseService< T>这个类(泛型类型需要指定具体继承类的类型),然后在继承后,继承类就会自动注入属性,在IOC容器中就会找到对应之前实现BaseDao< T>的具体类。

AOP

动态代理

public class ProxyFactory{
	public static Object getProxy(Object obj){
		Invocation invocation = new Invocation(obj);
		return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(),obj.getClass().getInterfaces(), invocation);
	}
}
class Invocation implements InvocationHandler{
	private Object obj;

	public Invocation(Object obj) {
		this.obj = obj;
	}
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object invoke = method.invoke(obj, args);
		return invoke;
	}
}

动态代理缺陷:被代理对象必须实现接口,因为代理对象和被代理对象实现了同样的接口,才能用代理对象调用被代理对象的方法。

AOP注解配置步骤
1、将目标类和切面类假如到IOC容器中,加特定的注解@Service @Repository @Component @Controller
2、还应该告诉spring到底哪个是切面类 @Aspect
3、告诉spring,切面类里面每一个方法,都是何时何地运行。@Before(value=execution()) @After (value=execution())@AfterReturning @Around(value=execution()) @AfterThrowing(value=execution()),execution(里面写切入表达式)
4、在配置文件中开启基于注解的AOP功能

细节
1、spring中默认的aop包中IOC创建的对象是代理对象,被代理对象必须是要实现接口,因为spring默认的aop底层就是动态代理,使用cglib代理,被代理对象可以不实现接口,cglib也可以为被代理类创建代理对象。
2、切入表达式的写法。
3、通知方法的通知顺序。
4、在通知方法中的有个JoinPoint joinPoint参数来获取目标方法信息,获取目标方法参数列表joinPoint.getArgs(), 获取方法签名joinPoint.getSignature() 在来获取方法的信息
5、结果和异常,需要在通知方法中传入Object result 和 Exception exception然后放在方法的注解上,分别是returning属性 = 参数值(result) ,throwing属性 = 参数值(exception)。即在通知方法中,参数列表不能乱传入,假如传入了参数,就应该告诉spring这个参数的作用是什么,怎么告诉了?通过在方法上的注解中的属性名=传入方法的参数值来告诉spring。
6、环绕通知,比较重要:可以整合4个通知,并且比普通通知更快

XML配置AOP

根据注解的步骤,去查找相应的XML对应的标签

事务

事务配置
包含注解的配置和xml的配置

<!--    6.事务的开启-->
    <!--    6.1.配置事务管理器-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--    6.2开启基于注解的事务控制模式;依赖tx名称空间 ,这是使用注解的配置方法-->
    <!--    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>-->
    <!--    6.2基于xml的事务配置配置-->
    <aop:config>
        <aop:pointcut id="txpointcut" expression="execution(* com.wlh.service.impl.*.*(..))"/>
        <!--        事务建议,事务增强 advice-ref指向事务管理器的配置-->
        <aop:advisor advice-ref="myAdvice" pointcut-ref="txpointcut"/>
    </aop:config>
    <!--    6.3配置事务管理器 transaction-manager指定是配置哪个事务管理器-->
    <tx:advice id="myAdvice" transaction-manager="dataSourceTransactionManager">
        <tx:attributes>
            <!--指明哪些方法是事务方法,切入表达式只是说事务管理器要切入这些方法,
            并没有说要加事务,要加事物的方法使用tx:method指定,并且可以配置相应的事务属性-->
            <tx:method name="*"/>
            <tx:method name="buyBookService" propagation="REQUIRED"/>
            <tx:method name="get*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
注解的配置需要加注解
@Transactional(timeout = 10,propagation = Propagation.REQUIRED)
    public Integer buyBookService(){}

事务xml配置

事务的特性
1、原子性
2、隔离性
3、持久性
4、一致性

@transactionManager的属性

重点)propagation:事务传播行为
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

(掌握)isolation:事务隔离级别
1、读未提交 Read uncommitted
2、读已提交 Read committed
3、重复度 Repeatable read
4、串行化 Serializable(用不到)

timeout:超时
readOnly:只读事务

异常的分类:
1、运行时异常:可以不用处理,默认都回滚;
2、编译时异常:需要处理要么try-catch,要么throws,默认不回滚
rollbackFor-Class[]:哪些异常不回滚,数组类名
rollbackForClassName-Strng[]数组写全类名
noRollbackFor-Class[]哪些异常回滚
noRollbackForClassName-Strng[]数组写全类名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值