A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-7-6 10:48 编辑

【石家庄校区】框架部分笔记


1. 面试题:IOC和DI的区别?IOC(控制反转)是指把对象的创建交由容器。DI(依赖注入)是给类中的属性赋值。DI不能单独存在需要在IOC的基础上完成操作。
2. BeanFactory是一个接口,采用延迟加载的方案,只有在调用getBean()方法时才会实例化Bean,ApplicationContext也是一个接口,采用的是立即加载的方案,加载了配置文件后就会将所有的Bean实例化,当使用时直接从容器中取出来。
3. 使用注解的方式给对象注入属性,该对象的类中的该属性要有get/set方法;使用注解方式给对象注入属性,如果这个注解加在了属性名上,那么这个属性可以不提供get/set方法也能成功赋值。
4. AOP应用场景:日志记录,性能统计,事务处理,安全控制,异常检测。
5. 面试题:Spring使用哪种动态代理机制?如果目标对象实现了接口,优先使用JDK的动态代理,如果目标对象没有实现接口使用cglib动态代理技术。
6. Spring标签整理:
1、<bean>用来在容器中生成一个实例对象<bean>标签下有<constructor-arg/>标签,用于通过构造方法给属性赋值;<property>标签用于给属性赋值,其中属性必须提供set方法,<property/>标签下有<list/>,<set>,<props/>,<map/>用于向集合中添加值。使用p,c虚拟命名空间可以及简化赋值过程,但是需要引入约束。
2、<context:component-scan/>标签用于设置扫描包中注解,有一个base-package属性,用于指定包。
3、<aop:config>用于声明要对aop进行配置,这个标签下有<aop:pointcut/>,用于指定切点,里面的expression属性写的是切点表达式;<aop:advisor>,用于定义传统的aop切面,里面有两个属性:advice-ref用于指定一个通知,pointcut-ref用于指定上面定义的那个切点。这样这三个父子标签就定义出了切面。如果是Spring整合AspectJ框架实现AOP(定义AspectJ框架的切面),需要使用<aop:aspect ref=”通知对象”>来代替<aop:advisor>标签,这个标签下面有很多关于通知的标签(可以定义多个通知和切点),分别指定通知的类型,所有的通知标签中有两个属性,method用于指定方法,pointcut-ref用于指定切点(也能使用pointcut单独定义一个)。可以这样理解,<aop:config>标签用于声明要对aop进行配置,首先切面中有一个切点,所以这个标签下有一个<aop:pintcut>标签用于定义切点,如果使用的是传统的Spring+AspectJ实现AOP的方式,那么还需要引入一个通知使用<aop:advisor>标签,这个标签中有两个属性advice-ref和pointcut-ref,这两个属性分别用于指定通知和切点,这样可以理解成<aop:advisor>标签才是真正定义了一个切面。如果使用是Spring+AspectJ框架实现AOP,那么在<aop:config>下使用<aop:pointcut>标签和<aop:aspect>标签,其中<aop:pointcut>用于定义切点,<aop:aspect>用于真正定义切面,这个标签下有一个属性ref用于引入通知,这个标签下有多个标签用指定通知的类型(前置,后置,环绕,异常,引介,最终),标签中指定要执行的方法与对应的切点,这样<aop:aspect>标签就定义出了一个切面。简单理解就是<aop:advisor>用于定义Spring中的aop切面,<aop:aspect>标签用有定义AspectJ框架中的aop切面。
4、<aop:aspectj-autoproxy/>用于开启AspectJ注解自动代理,这个标签下有一个属性proxy-target-class默认值是false表示如果要代理的类实现了接口就使用JDK的动态代理,如果没有实现接口就使用Cglib动态代理,如果将值改成true,表示全部使用Cglib动态代理。
5、当使用声明式事务时要使用<tx:advice>这个标签用于定义一个通知,这个标签下有子标签<tx:attributes>标签用于设置属性,其中属性标签<tx:method name=””>用于指定这个事务要管理哪个方法,其中的name属性必填,还有一些其他的属性,且<tx:method>标签可以有多个。
6、<tx:annotation-driven/>相当于开启注解事务控制。
7. Spring注解整理:
1、@Component:将类实例化到Spring容器中。这个注解有三个衍生注解:1)@Rpository,用于Dao层。2)@Service,用于Service层。@Controller,用于变现层。
2、@Value:用于给属性赋值(基本数据类型和字符串)。
3、@AutoWired:用于根据类型自动注入数据(引用数据类型)。
4、@Qualifier,跟@AutoWired注解一起使用,指定注入哪个对象,使用@Resource注解可以替代上面两个注解的组合。
5、@Aspect用于声明当前bean就是一个切面。@Before(”切点表达式“)在方法上使用,用于指明该方法是哪种类型的通知。
6、@Tracsactional,这个注解声明在类上的时候表示本类中的所有方法全部使用事务管理,如果声明在方法表示对本方法使用事务管理。注意使用@Transactional可以不使用@Component注解。当使用这个标签时在xml加上<tx:annotation-driven/>表示开启注解事务控制,但是使用注解事务控制,还是要配置事务管理器,如果<tx:annotation-driven/>标签中不显示的指明使用的事务管理器那么前面定义的事务管理器只能叫transactionManager,因为这个表标签中的默认的事务管理器的名称就是transactionManager,不再需要在配置其他东西(连<context:component-scan>都不需要),所有匹配到这个类中配置到的方法都会添加事务管理。
8. Spring中的AOP定义的是一个切面,这个切面会拦截所有切面中的所有的方法,只要在spring容器中的对象使用方法满足切面中定义的切点就会使用动态代理,如果容器中的对象调用的方法不满足切面中定义的切点,那么不会使用动态代理,而且如果这个对象如果不在Spring容器中,即便是调用的方法满足切面中的切点,框架也拦截不到,因为如果对象不在容器中,框架就不能管理该对象。
9. 声明式事务管理因为是给指定的方法加上事务管理,所以通知是框架提供的,我们只需要配置上要添加事务管理的方法就行。注意,拦截器要拦截的方法可能与要添加事务管理的方法不全相同,故<aop:pointcut/>中定义的是要拦截的方法,但是<tx:method>中定义的是拦截到后要添加事务管理的方法。
10.  Spring+AspectJ框架使用注解开发时要在配置文件中开启AspectJ注解自动代理使用<aop:aspectj-autoproxy/>标签。
Spring使用注解开发时,使用<context:component-scan/>标签设置自动扫描包中注解。Spring中使用注解使用声明式事务管理时使用<tx:annotation-driven />开启注解事务控制,这个标签中可以指定一个事务管理器,如果不指定会有一个默认名字的事务管理器,但是如果没有声明该名字的事务管理器会出错,声明了该名称的事务管理器,可以不在这个标签配置。
11. 使用Struts框架的注解时Action要放在包名中存在struts,action,struts2,actions中的一个或多个的包中。
12. 在web_xml中配置的过滤器顺序就是过滤器的执行顺序。
13. 切点表达式必须定位到接口或类然后定位到一个或一类方法才能用,如果没有定位到一个确切的类或接口,会报错。例如:execution(* 包名.*.*(..))表示在指定的包下的所有类或接口的所有方法,如果写成execution(* *.*.*(..))或execution(* *.*(..))会报错,但是execution(* *.*.add*(..))表示任意一个包下的任意类或接口中的以add开头的方法,总之,全部都使用通配符“*”就是会报错。
14. Spring整合Hibernate配置文件方案注意事项:1)配置数据源。2)配置数据库方言。3)配置映射文件。4)配置一个额外的过滤器,将开启事务和关闭事务的操作提前,解决延迟加载的问题。
15. Spring整合Hibernate注解方法注意事项:1)配置数据源。2)配置数据库方言。3)配置要扫描的注解所在的包(代替配置文件方案的映射文件的配置)。4)配置一个额外的过滤器,将开启事务和关闭事务的操作提前,解决延迟加载的问题。
16. Spring整合Struts框架配置文件方案注意事项:1)配置Struts框架依赖的过滤器。2)如果使用的是手动注入service对象的方式,那么在Struts.xml文件中该action的class属性要填写applicationContext.xml中定义的该bean的名字。如果使用的是自动注入的方式,那么Strust.xml
文件中action标签中的class属性依然是该action的全类名,在该action中的成员变量service名字要跟容器中的service对象的名字一致,并提供set方法,这样容器就会根据名字将service注入进action对象中。3)action对象要设置成多例。
17. Spring框架整合Struts框架注解方案注意事项:1)配置Struts依赖的过滤器。2)将Action设置成多例。3)导进去一个struts2-convention-plugin插件包。
18. 如果使用Spring+AspectJ框架注解方式的动态代理方案要加上一个自动代理<aop:aspectj-autoproxy />标签。如果使用注解方式将对象交由容器管理时要加上注解自动扫描标签<context:component-scan base-package="包名,如果是多个用逗号分隔" />。如果使用注解开发声明式事务,要加上注解驱动标签<tx:annotation-driven />,如果这个标签中指定事务管理器的名字,那么默认的事务管理器的名字是transactionManager,如果找不到这个名字的事务管理器会报错。
19. Hibernate中的事务默认是只读的,Spring整合Hibernate并由容器提供事务管理,只有配对了切面(切面中的通知将事务的只读属性值更改,其实不用更改,默认就是给更改了),在执行某些方法时使用代理对象才会改变Hibernate默认只读事务的属性。
20. <context:component-scan/>这个标签用于扫描注解(@Component,@Repository,@Service,@Controller)在容器中生成对象。
21. 如果Spring动态代理报错八成是切点表达式写错了(人不二过)。
22. Spring使用注解开发需要使用标签<context:component-scan/>扫面注解(针对@Component,@Repository,@Service,@Controller);Hibernate使用注解开发要配置扫描的包(Spring的配置文件中配置Hibernate时配置的是Hibernate中的一个属性值,使用set注入方式设置值,单独使用Hibernate时使用的是mapping标签,使用的是标签中的class属性(如果是使用的配置文件方式,使用的是resource属性))。Struts2使用注解开发时要导包,不到包没有注解提示。Spring+AspectJ框架使用注解开发aop时要开启注解自动代理使用<aop:aspectj-autoproxy />标签。Spring使用注解开发声明式事务时要加上注解驱动标签<tx:annotation-driven />。总之只要使用注解都要有一个关于使用注解的配置。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马