一、IOC
1.Spring 开源 控制反转(IOC、DI
) 面向切面
2.DI 依赖注入 在运行期动态的将对象注入到应用中。
3.优点:①.降低耦合度,实现各层解耦。
②.提供众多服务,如事务管理服务、消息服务。
③.容器提供单例模式支持。
④.AOP 可实现权限拦截、运行期监控等。
⑤.众多辅助类。JdbcTemplate、HibernateTemplate
⑥.spring提供主流应用框架的集成支持。
4.获取配置文件ApplicationContext和ClassPathXmlApplicactionContext
5.对已有类抽取接口
6.scope ①.singleton 默认单例
②.prototype 原型
③.request
④.session
⑤.global session
7.init-method destroy-method
8.set方法注入
<bean id="personService" class="org.likui.service.impl.PersonServiceBean">
<property name="personDao" ref="personDao"></property>
</bean>
//name是类中属性的名称,ref是配置文件中bean的id
①.循环所有的bean
②.获取bean的属性描述
③.循环bean中的所有的property
④.循环所有的属性描述
⑤.判断bean的属性描述的名称是否和property的name相等
⑥.如果相等,在所有的bean中获取名称与rel相等的bean,注入到当前bean中。
9.<property name="personDao" ref="personDao"></property>
10.<property name="personDao">
<bean class="org.likui.dao.impl.PersonDaoBean" />
</property>
11.注入基本类型的数据时使用commons-beanutils 中的 ConvertUtils.convert(String value, class clazz);将value转成clazz类型
12.注入集合类型 set list map properties
13.使用构造器注入
<constructor-arg index="0" type="org.likui.dao.PersonDao" ref="personDao"></constructor-arg>
<constructor-arg index="1" value="李魁"></constructor-arg>
14.使用注解进行注入。上面都是基于xml注入。
@Autowired 默认按类型进行装配 spring提供 通过
@Qualifier("personDaoXxx")可改变默认行为,改变为按名称注入
@Resource 默认按名称进行装配,如果找不到与名称匹配的bean才会按类型进行装配 java提供,推荐使用,与框架耦合度低。
15.手工装配,自动装配。推荐使用手工装配。
16.自动装载 autowire="byType、byName、constructor(与构造器类型匹配)、autodetect(在byType和constructor中选择一个)"
17.自动扫描的方式将组建纳入spring容器中管理 @Component(不好归类的)、@Service、@Controller、@Repository(Dao层)
18.@Scope 类的作用域 @PostConstruct 类的初始化方法 @PreDestroy 类的销毁方法
-------------------------------------------------------------------------------------------------------------------------------------------------
问题:1.自动装载的顺序。2.自动装载是否需要注入
-------------------------------------------------------------------------------------------------------------------------------------------------
二、AOP
简单权限控制
1.拦截所有业务方法
2.判断用户是否有权限,有权限就允许执行业务方法,没有权限不允许执行业务方法.(是否有权限是根据user是否为null作为判断)
代理对象 Proxy代理类(目标类必须实现接口)
1.静态代理(用得比较少)
2.动态代理
横切性关注点
通知类型
1.前置通知
2.后置通知
3.例外通知
4.最终通知
5.环绕通知
----------------------------------------
1.注解方式配置AOP
@Aspect 声明一个类是一个切面
@Pointcut 拦截方法
--
@Pointcut("execution(* org.likui.service..*.*(..))")
|-- execution 执行
|-- * 返回值类型 java.lang.String | !void
|-- org.likui.service 包
|-- .. 所有子包
|-- * 所有类
|-- * 所有方法
|-- .. 任意参数 (Java.lang.String , .. )
//获取参数
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知:" + name);
}
//获取返回值
@AfterReturning(pointcut = "anyMethod()",returning="result")
public void doAfterReturning(String result){
System.out.println("后置通知:" + result);
}
//获取异常
@AfterThrowing(pointcut = "anyMethod()",throwing="e")
public void doAfterThrowing(Exception e){
System.out.println("例外通知");
e.printStackTrace();
}