1.Spring 在ssm中起什么作用?
Spring:轻量级框架
作用:Bean工厂,用来管理Bean的生命周期和框架集成。
两大核心:
①. IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。
②. AOP:面向切面编程
整合资源,实现对象管理。Spring核心有两个方面IOC(依赖注入)和AOP(面向对象切面编程) Spring贯穿在整个项目之中,每当我们需要new 一个对象的时候,其实很耗资源的, 通过spring可以被动的让我们获取想要的对象而不用每次都去new AOP里面的代理也用的很广泛,比如说我们有时候需要调用某个类的方法的时候 ,不想通过对象去调用,而是用代理间接地去调用,为其添加扩展业务。
2、Spring的事务?
编程式事务管理:编程方式管理事务,极大灵活性,难维护。
声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
3、IOC 在项目中的作用?
作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。
IOC:控制反转,是一种设计模式。一层是控制权的转移:由传统的在程序中控制并依赖转移到容器赖控制;第二是依赖注入:将相互以来的对象分离,在Spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。
4、Spring的配置文件中的内容?
开启事务注解驱动
事务管理器
开启注册功能,并配置扫描包
配置数据库
配置SQL会话工厂,别名,映射文件
不用编写Dao层实现类
5、Spring下的注解?
注册:@Controller @Service @Component
注入:@Autowired @Resource
请求地址:@RequestMapping
返回具体数据类型而非跳转:@ResponseBody
Spring常用注解介绍【经典总结】https://blog.csdn.net/u010648555/article/details/76299467
@Component :标准一个普通的spring Bean类。
@Repository:标注一个DAO组件类。
@Service:标注一个业务逻辑组件类。
@Controller:标注一个控制器组件类。 这些都是注解在平时的开发过程中出镜率极高,
@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。
@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。
2、举例详解
(1)当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解,如下
(2)当一个组件代表业务层时,我们使用@Service进行注解,如下
(3)当一个组件作为前端交互的控制层,使用@Controller进行注解,如下
3.总结注意点
1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!
2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护!
3、指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置 。
6、Spring DI 的三种方式?
1.构造器注入
2.setter方法注入:通过setter方法初始化
3.接口注入
1. 自动化配置(最推荐,避免显示配置带来的维护成本)
1.1 组件扫描:spring自动发现容器所创建的bean。开启组件扫描,默认情况下自动扫描配置类相同包(以及子包)下所有带有@component注解的类,并为其自动创建一个bean。
那么,如何开启组件扫描呢?
答:有两种方式,基于java配置(推荐)和xml配置
Java配置:在配置类上添加@componentScan注解
Xml配置:利用
1.2 自动装配:spring自动满足bean之间的依赖。使用@Autowired(推荐)或@Inject注解添加在构造、setter还是其他方法上,实现bean的自动注入,无需手动去new。
2. Java配置(推荐,基于java语言,类型安全易于重构)
利用@Bean注解来声明(创建)一个bean,同时还可以注入另外依赖的bean(利用构造器和setter方法)
3. Xml配置
3.1利用
举例
3.2 如何注入bean(构造器和setter方法)
构造器注入bean,举例
构造器注入字面量,举例
c 命名空间注入bean,举例
c 命名空间注入字面量,举例
利用、
Setter方法注入bean,举例
Setter方法注入字面量,举例
7、Spring主要使用了什么模式?
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.单例模式,默认的每个Bean的作用域都是单例。
5.Tomcat中有很多场景都使用到了外观模式,
因为Tomcat中有很多不同的组件,每个组件需要相互通信,但又不能将自己内部数据过多地暴露给其他组件。用外观模式隔离数据是个很好的方法。
6.策略模式
在Java中的应用,这个太明显了,因为Comparator这个接口简直就是为策略模式而生的。Comparable和Comparator的区别一文中,详细讲了Comparator的使用。比方说Collections里面有一个sort方法,因为集合里面的元素有可能是复合对象,复合对象并不像基本数据类型,可以根据大小排序,复合对象怎么排序呢?基于这个问题考虑,Java要求如果定义的复合对象要有排序的功能,就自行实现Comparable接口或Comparator接口.
7.原型模式:
使用原型模式创建对象比直接new一个对象在性能上好得多,因为Object类的clone()方法是一个native方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
8.迭代器模式:
Iterable接口和Iterator接口 这两个都是迭代相关的接口,可以这么认为,实现了Iterable接口,则表示某个对象是可被迭代的;Iterator接口相当于是一个迭代器,实现了Iterator接口,等于具体定义了这个可被迭代的对象时如何进行迭代的
8、IOC,AOP的实现原理?
IOC:通过反射机制生成对象注入
AOP 说的通俗点就是利用jdk的动态代理或者其他类似的技术在类实例化的时候将你所需要的内容比如日志和事物无缝填充到你得目标类中。
实现的方法 JDK动态代理和CGLIB代理
JDK动态代理:
其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。
CGLIB代理:
实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ注解驱动的切面实际上底层也是通过动态代理实现的。
