-
ioC容器在管理什么? (Service与Dao)
2.如何将被管理的对象告知IoC容器? 配置文件标签bean 通过class指定实现类的全路径
3.如何获取IOC容器 applicationContext.xml
new ClassPathXmlApplicationContext -
bean基础配置需要指定哪些属性?
答: id、class
2… bean别名如何配置?
答:使用name属性配置
3.bean 作用范围都有哪些?
答: singleton、prototype、request、
session、 application、 websocket
实例化bean的三种方式
1.提供可访问的构造方法
2.实例工厂 获取工厂实例 获取实例方法
3.FactoryBean
依赖注入方式
像一个类中传递数据的方法
1.普通方法 set方法 setter注入
(1)简单类型 基本数据类型+String
(2)引用类型
2.构造方法 简单类型+引用类型
name type index
依赖自动装配(DI 注入)
按 类型 名称 构造方法
<bean id class … autowrite=“byType”>
Bean的生命周期
初始化容器
1.创建对象
2.执行构造方法
3.执行属性注入
4.执行bran初始化方法 init
使用bean
执行业务操作
关闭销毁容器
执行 bean销毁方法 destory
核心容器总结
1.聊一聊BeanFactory 与ApplicationContext?
获取容器用 继承关系A是B的扩展
区别:Bean的延迟加载
2.配置Bean会用到哪些属性?
id class name scope init-method destory-method autowrite
3.Bean的注入有哪些方式?能注入哪些类型的数据?
setter 注入 简单类型 引用类型 property
构造器注入 简单类型 引用类型 constructor-arg
4.面试题: BeanFactory和 FactoryBean有什么区别?
BeanFactory 工厂 创建 使用 销毁 Bean
FactoryBean Bean 一种实例化方式 可以用于获取Bean
注解开发
1.如何使用注解定义bean?
类前加入注解
@Component
@Controller 表示层
@service 服务层
@Repository 数据层
2.如何使用纯注解开发?
@Configuration 配置类
@ComponetScan 扫描注解
@PropertySource(“classpath:jdbc.properties”)
获取容器
new AnnocationConfigApplicationContext()
Bean管理
1.使用哪个注解指定bean作用范围?
@scope
2. bean生命周期可以使用哪些注解?
@PostConstruct
@PreDestroy
依赖注入
自动装配注解
@Autowired 开启自动装配模式
@Qulifier(“bean名称”)指定要装配的bean名称
@Valuer(${name}) 实现简单类型注入 注意这种形式需要再配置中加载属性文件 @PropertySource()
第三方Bean
1.管理第三方 Bean 交给Spring管理 @Bean
2.@Import({jdbcConfig.Class})将独立的配置类加入核心配置
AOP代码增强
思路
- 导入坐标(pom.xml)
- 制作连接点方法(原始操作,dao接口与实现类)
- 制作共性功能(通知类与通知)
@Aspect 通知类
@component 被扫描 - 定义切入点
@Pointcut(“executiom(增强的方法)”) 对谁做增强
public void pt() - 绑定切入点与通知关系(切面 :描述通知与切入点的对应关系
什么时候增强 增强那些内容
@Before(“pt()”)
pubilc void before(){
sout(shkghjk)
}
AOP切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
1.格式:动作关键字(访问修饰符﹑返回值﹑包名.类/接口名.方法名(参数)异常名)
动作关键字 excution()
2.批量 execution (public * com.itheima..UserService.find(*))
AOP通知类型
1.前置通知
@Before(" “)
public void before(){}
2.后置通知
@After(”")
public void after(){}
3.环绕通知(重点)
@Around ( "pt () ")
public Objectaround (ProceedingJoinPoint joinPoint) throws Throwable {
system.out.println ( “around before” ) ;
//执行被代理的方法
Object proceed = joinPoint.proceed ( ) ;
system.out.println ( “around after” );
return proceed;
}
@Around("pt()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//获取签签名
Signature signature = joinPoint.getSignature();
//获取接口名称
String type = signature.getDeclaringTypeName();
//获取方法名称
String name = signature.getName();
Integer proceed = null;
//获取开始时间
long start = System.currentTimeMillis();
//万次执行
for(int i=0;i<10000;i++){
//执行被代理的方法
proceed = (Integer) joinPoint.proceed();
}
//获取结束时间
long end = System.currentTimeMillis();
long time = end - start;
System.out.println("方法万次执行时间为:"+type+"."+name+"===>"+time+"ms");
return proceed;
}
AOP通知获取数据
1.获取切入点方法的参数
JoinPoint jointPoint
ProceedJointPoint jointPoint 适用于环绕通知
jointPoint.getArgs[]
2.获取方法的返回值
环绕通知 proceed = joinPoint.proceed();
返回后通知 注解中指定哪个参数作为返回值 通知中加入一个参数作为返回值
@AfterReturning(value = “pt()”,returning = “num”)
public void afterReturning(Integer num) {}
3.获取切入点方法运行异常信息
1.环绕通知
try {
proceed = joinPoint.proceed();
} catch (Throwable throwable) {
System.out.println("save 异常");
}
2.抛出异常通知
@AfterThrowing(value="pt()",throwing="t")
public void afterThrowing(Throwable t) {}
Spring事务
事务作用:在数据层保障一系列的数据库操作同成功同失败
Spring事务:在数据层或业务层保证数据库操作 事务管理接口+事务实现类 接口中有两个方法 提交 或者回滚
public interface PlatformTransactionManager{
void commit(Transactionstatus status) throws TransactionException;
void rollback(Transactionstatus status) throws TransactionException;}
public class DataSourceTransactionManager
}