Spring面试题
springIOC
IOC——Inverse of Control,即控制反转,不是技术,而是一种设计思想。ioc意味着将你设计好的对象交给容器控制,而不是在传统的在你的对象内部直接控制
谁控制谁,控制什么:Ioc容器控制对象;控制了外部资源的获取(不只是对象包括比如文件等)
为何是反转,哪些方面反转了?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。
反转了对象的获取方式,以前是在程序中new,变为从容器中取。
依赖注入:将属性值 注入给了属性,将属性 注入给了bean,将bean注入给了ioc容器;
springAOP
AOP即面向切面编程
核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。
我们主要使用AOP来做:
1、事务处理 执行方法前,开启事务、执行完成后关闭事务、出现异常后回滚事务
2、权限判断 在执行方法前,判断是否具有权限
3、日志 在执行前进行日志处理
4、....
spring依赖注入的三种方式
1)set注入:通过setXXX()赋值(默认),依赖注入底层是通过反射实现的。
<!-- set方法注入--> id:唯一标识,class:指定类型 <bean id="student" class="com.lanqiao.entity.Student"> property:该class类所代表的属性, name:属性名 value:属性值 <property name="stuNo" value="1"></property> <property name="stuName" value="wangwu"></property> <property name="stuAge" value="18"></property> </bean>
2)构造器注入:通过构造方法赋值。需要注意:如果 <constructor-arg>的顺序 与构造方法参数的顺序不一致,则需要通过type或者index或name指定。
<!-- 构造方法注入 --> <bean id="student" class="com.lanqiao.entity.Student"> <constructor-arg name="stuNo" value="1"></constructor-arg> <constructor-arg name="stuName" value="lisi"></constructor-arg> <constructor-arg name="stuAge" value="16"></constructor-arg> </bean>
3)p命名空间注入,首先引入p命名空间xmlns:p="http://www.springframework.org/schema/p"
简单类型:p:属性名="属性值",引用类型(除了String外):p:属性名-ref="引用的id"
注意多个 p赋值的时候 要有空格。
<bean id="course" class="org.lanqiao.entity.Course" p:courseHour="300" p:courseName="hadoop" p:teacher-ref="teacher">
<!-- p名称注入 --> <bean id="student" class="com.lanqiao.entity.Student" autowire="byType"> <property name="stuNo" value="1"></property> <property name="stuName" value="wangwu"></property> <property name="stuAge" value="18"></property> <property name="teacher" ref="teacher"></property> </bean>
<bean id="teacher" class="com.lanqiao.entity.Teacher" p:name="xiaohua"> <property name="name" > <value type="java.lang.String">z<![CDATA[<>&]]>s</value> </property><property name="name" value="z<s"></property> <property name="name" value=""></property>
2.spring注入各种集合数据类型list set map properties
1)注入list
<bean id="collection2" class="com.lanqiao.entity.CollectEntry"> <property name="list"> <list> <value>zhangsan1</value> <value>zhangsan2</value> <value>zhangsan3</value> <value>zhangsan4</value> </list> </property> </bean>
2)注入map
<property name="map"> <map> <entry> <key> <value>xiaoming</value> </key> <value>lanqiu</value> </entry> <entry> <key> <value>xiaohong</value> </key> <value>zuqiu</value> </entry> </map> </property>
3)注入set
<property name="set"> <set> <value>lisi</value> <value>wuwang</value> <null></null>给集合赋值null <value></value>给集合赋值空值 </set> </property>
4)注入properties
<property name="props"> <props> <prop key="user">lisi</prop> <prop key="user2">lisi2</prop> <prop key="user3">lisi3</prop> </props> </property>
5)注入数组
<property name="string"> <array> <value>zhongguo</value> <value>zhongguo1</value> <value>zhongguo2</value> <value>zhongguo3</value> <value>zhongguo4</value> </array> </property>
注意:在ioc中定义bean的前提是该bean的类 必须提供了 无参构造
自动装配
自动装配(只适用于 ref类型 ):约定优于配置
<bean ... class="org.lanqiao.entity.Course" autowire="byName|byType|constructor|no" > byName本质是byId
byName: 自动寻找:其他bean的id值=该Course类的属性名
byType: 其他bean的类型(class) 是否与 该Course类的ref属性类型一致 (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件 )
constructor: 其他bean的类型(class) 是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType
可以在头文件中 一次性将该ioc容器的所有bean 统一设置成自动装配:
<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">
自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎。