1.Spring的依赖注入
1.1什么是Spring
它是一个轻量级和IOC(DI)和AOP的 容器框架
IOC:控制反转 现在创建bean的方式,是交给spring帮我们创建
DI依赖注入 spring它是容器框架,是一个bean(装对象的)容器框架,spring帮我创建好对象之后,在把我们创建好的对象 注入到相应的类里面 这个过程
AOP: 面向切面的编程
使用场景:事务管理,日志管理,性能控制
1.2 Spring的依赖注入
1.2.1 set方式注入(最开始)
以前
UserController{
private UserService userService;
void setUserService(UserService userService){
this.userServicer = userService;
}
}
1.2.2构造器注入–掌握
index索引注入
constructor-arg index=“0” value=“123”></constructor-arg
name 参数名字注入
constructor-arg name=“id” value=“456”></constructor-arg
type类型注入
constructor-arg type=“java.lang.Long” value=“111”></constructor-arg
1.2.3 类里面属性注入–掌握
最常用就是基本类型和引用类型注入 --掌握
property name=“id” value=“111”></property
property name=“name” value=“康康”></property
property name=“hellobean” ref=“hb”></property
property name=“hellobean”
bean class=“xxxx”></bean
/property
map list/set/array了解
注入properties – 掌握
property name=“prop2”>
props>
prop key=“driverClassName”>com.mysql.jdbc.Driver
prop key=“username”>qiang强
/props>
/property>
1.3XML版本自动注入–了解
可以byNam注入 – 按照名称自动注入
或者byType注入 – 按照类型自动注入
1.4 XML版本注解注入–掌握
扫描包路径
<context:component-scan base-package="_03_annoxml.cn.itsource"></context:component-scan>
@Atuowrite自动注入
如果一个接口有两个实现情况下:
方案一:一个接口有多个实现的情况下面 通过名字去区分
方案二:通过Resource这个注解
区别:@Autowired和@Qualifier 都是属于spring的注解 ,
Resource使用jdk的注解 推荐使用Autowired和Qualifier,可以和spring进行无缝衔接
autowired默认是根据类型匹配,如果类型匹配不上在根据名字匹配
而Resource默认根据名字匹配,名字匹配不上就匹配类型
2.Spring里面的AOP功能
2.1 什么是springAOP
aop: 面向切面的编程
2.2aop的实现
aop底层使用代理模式实现
jdk代理模式 --有接口情况下
cglib动态代理 --没有接口情况下
2.3springaop配置方式
xml版本的配置
注解版
@Component
@Aspect //AOP的类注解
public class TxManager {
//设置切点
@Pointcut(“execution(* cn.itsource.aopanno.IService.(…))”)
public void pointcut(){}
//前置通知
@Before(“pointcut()”)
public void begin(){
System.out.println(“开启事务…”);
}
//后置通知
@AfterReturning(“pointcut()”)
public void commit(){
System.out.println(“提交事务…”);
}
//异常通知
@AfterThrowing(pointcut=“pointcut()”,throwing=“e”)
public void rollback(Throwable e){
System.out.println(“回滚事务…”);
System.out.println(e.getMessage());
}
//最终通知
@After(“pointcut()”)
public void close(){
System.out.println(“关闭资源…”);
}
}
环绕方法
//温馨提醒:如果要使用环绕通知的话,把其它几个通知的注解去掉(不然会出现重复)
@Around(“pointcut()”)
public Object around(ProceedingJoinPoint joinPoint){
Object object = null;
try {
begin();
object = joinPoint.proceed(); //执行相应的代码
commit();
} catch (Throwable e) {
rollback(e);
}finally{
close();
}
return object;
}
3.创建Bean的方式
3.1实例化一个有公共无参的构造方法
自己写的对象:Dao,Service,Action都使用这种方法
entityManager= entityManagerFactory.createEntityManager();
bean id=“myBean” class=“cn.itsource.spring.day2.d_prop.MyBean”/>
3.2使用FactoryBean
public class MySessionFactoryBean implements FactoryBean {
//最后返回的则是这一个对象
@Override
public SessionFactory getObject() throws Exception {
return new SessionFactory();
}
//返回类型
@Override
public Class<?> getObjectType() {
return SessionFactory.class;
}
//是否是单例
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
第三步:配置这个Bean,它拿到的是就是SessionFactory
第四步:测试(拿到SessionFactory就算是配置成功 )
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class FactoryBeanTest {
@Autowired
private SessionFactory factory;
@Test
public void testname() throws Exception {
System.out.println(factory);
}
}
面试题:说一下BeanFactory与FactoryBean的区别
BeanFactory接口,顶层父工厂,容器,获取bean的实例
FactoryBean 接口,实例化不能通过默认无参构造方法获取的bean
通过子类的getObject方法来返回实例,如SessionFactory
如果一个类没有构造方法,但是可以用其它方式拿到它的对象,就可以用FactoryBean
多用于Spring的框架集成
org.springframework.orm.hibernate3.LocalSessionFactoryBean
集成hibernate3.x
Org.springframework.orm.hibernate4.LocalSessionFactoryBean
集成hibernate4.x
3.3使用静态简单工厂
3.4集成实例简单工厂