spring--入门

一、Spring基本特征


1.Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发. 

  2.Spring的 jar包

3.Spring配置文件
      默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的。

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
Spring IOC(控制反转)
 
依赖注入(DI)


      张三

   
   
   
   
   
   
   

   
   
    list1
    list2
   
   

   

   
   
    set1
    set2
   
   

   

   
   
   
    map1
   

   
   
   

   

   

   
   
    prop1
    prop2
   

   

   
   
    obj1
   
   

   

   




4.Spring基本功能详解
SpringIOC
Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。


   A.启动spring容器
1、在类路径下寻找配置文件来实例化容器 
                     ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");可以在整个类路径中寻找xml文件


   B.从spring容器中提取对象
3.2别名






   C.Spring容器内部对象
 
   创建对象的方式:
a.无参构造函数

b.静态工厂

c.实例工厂




   D.对象的scope
* singleton/default(默认)
默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。


* prototype 允许bean可以被多次实例化(使用一次就创建一个实例) . 
* Request  在一次HTTP请求中,一个bean定义对应一个实例,该作用域仅在基于web的spring ApplicationContext情形下有效。
* Session 在一次HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的spring ApplicationContext情形下有效。
* Global session 在一个全局的Http Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。
该作用域仅在基于web的spring ApplicationContext情形下有效。


   E.init、destroy(初始化方法可以获取Hibernate的this.getHibernateTemplate.getSessionFactory)***********************************



当foo被载入到Spring容器中时在构建对象之后(调用无参构造函数)如果有属性的装配先调用属性的Set方法之后调用init-method方法。
当foo从容器中删除时调用destory-method(scope = singleton有效)


   F.注解
A.在配置文件中,引入context命名的名称空间
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"


B.在配置文件中加入context:annotation-config标签
 


   使用:@PostConstruct//Spring容器的初始化方法注解
@Resource(name="student")标注在字段或属性的setter方法上.(只适用于引用类型数据)javax.annotation.Resource
@Resource = @Autowired + @Qualifier
@Autowired  //按照类型进行匹配org.springframework.beans.factory.annotation.Autowired;
@Qualifier("student")//按照指定注解属性名进行匹配org.springframework.beans.factory.annotation.Qualifier;
原理:
1、当启动spring容器的时候,创建两个对象
2、当spring容器解析到
  spring容器会在spring容器管理的bean的范围内查找这些类的属性上面是否加了@Resource注解
3、spring解析@Resource注解的name属性,
  如果name属性为"",说明该注解根本没有写name属性,spring容器会得到该注解所在的属性的名称和spring容器中的id做匹配,如果匹配成功,则赋值如果匹配不成功,则按照类型进行匹配
  如果name属性的值不为"",则按照name属性的值和spring的id做匹配,如果匹配成功,则赋值,不成功,则报错
@PostConstruct//指定Bean的初始化方法
@PreDestroy//指定Bean的销毁方法


G.扫描(与引入注解的名称空间一样)
spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Repository、@Service、@Controller注解的类
1.
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">



2.在配置文件中添加context:component-scan标签 
       
 
3.功能介绍
@Repository用于标注数据访问组件,即DAO组件。
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。


F.spring中的继承
  如果父类中配置的参数子类需要继承下来用有两种方案:
1.在子类配上parent属性值即可
2.在子类调用父类的set方法进行属性的装配


5.SpringAOP面向切面编程(需要导入面向切面编程的aspectj包、和CGLIB包)


a.JDK动态代理(基于接口的动态代理)java.lang.reflect.Proxy


public class JDKProxy implements InvocationHandler{
private Object target;


public Object createProxyInstance(Object target){
this.target = target;


return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{
return method.invoke(this.target,args);//定义方法的返回值
}
}
           b.CGLIB做代理(基于子类的动态代理)   可以在Spring配置文件中设置 强行为CGLB代理
public class CGLIBProxy implements MethodInterceptor{  
private Object target;//代理目标类
public Object createProxyInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();//生产代理对象
enhancer.setSuperclass(this.target.getClass());//设置父类
enhancer.setCallback(this);//设置回调用对象为本身
return Enchancer.create();//创建代理对象
}  
public Object intercept(Object obj,Method method,Object[] args,MethodProxy methodProxy)throws Throwable{
return method.invoke(this.target,args);//定义方法的返回值
}
}        
**************************************************************AOP编程************************************************************************************************************
引入名称空间:
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd


* Aspect(切面)
比如说事务、权限等,与业务逻辑没有关系的部分的类(非目标对象)


* Pointcut(切入点)
所谓切入点是指我们要对那些拦截的方法的定义.(需要拦截的条件)


* joinpoint(连接点)
目标类的目标方法。(由客户端在调用的时候决定)


* Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知.(执行切面的方法)
方法参数类型
通知分为前置通知 JoinPoint joinPoint
后置通知,JoinPoint joinPoint,Object value
异常通知,JoinPoint joinPoint,Throwable ex
最终通知,JoinPoint joinPoint
环绕通知 ProceedingJoinPoint joinPoint  //ProceedingJoinPoint的proceed方法相当于invoke方法,调用目标类的目标方法
joinPoint.getSignature().getName()//连接点名字
joinPoint.getTarget().class()//目标类


* Target(目标对象):
代理的目标对象


* Weaving(织入)
是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象 


 AOP实现的两种模式


XML形式:


























**************切入点中表达式方式:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern name-pattern (param-pattern) throws-pattern?)
修饰符 返回值类型  所在的包和类 方法名 参数 异常
execution(public * *(..))任意的公共方法
execution(* set*(..))以set开头的任意方法
execution(* com.service.AccountService.*(..)) com.service.AccountService类中的所有的方法
execution(* com.service.*.*(..))com.service包下的所有的类的所有的方法
execution(* com.service..*.*(..))com.service包及子包的所有的类的所有方法
execution(* com.*.service.*.*(..))com包下的任意一个包下的service包下的所有类的所有方法
execution(* com..service..*.*(..))com包及子包一直到service包及子包所有类的所有方法

AOP注解形式:
在Spring配置中启动使用@AspectJ切面的支持



eg:
@Aspect//声明切面
public class TransactionManager{
//表示service包下所有以save开头的方法
    @Pointcut("execution(* com.service.*.save*(..))")
    private void aa(){} //方法签名 返回值必须为void


//前面定义的方法签名,参数必须与通知一样
    @Before("aa()&&args(userName,password)")
    public void beginTransaction(String userName,String password){}


//前面定义的方法签名,方法无返回值时为空
    @AfterReturning(pointcut="aa()",returning="value")
    public void commit(Object value){}


    @AfterThrowing(pointcut="aa()",throwing="ex")
    public void throwsEx(Exception ex){}


    @After("aa()")
    public void finalMessage(){}


    @Around("aa()")
    public Object aroundMessage(ProceedingJoinPoint point) throws Throwable{
String methodName = point.getSignature().getName();
String[] methodArgs = point.getArgs(); 
Class clazz = point.getTarget().getClass();
point.proceed();//调用目标对象的目标方法
    }
}


六、Spring数据库***************************************************************************************************************
JdbcAccessor-->JdbcTemplate-->JdbcDaoSupport
HibernateAccessor-->HibernateTemplate-->HibernateDaoSupport


**********Spring+JDBC(Hibernate类似)


Jdbc编程特点:静态代码+动态变量 = jdbc编程。


  1、在Spring配置中引入DataSource

   方式一:
 
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">


classpath:jdbc.properties


    
  class="org.apache.commons.dbcp.BasicDataSource">








jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/hibernate(自定义)
jdbc.username=root
jdbc.password=root
------------------------------------------------------------------------------------------------
   方式二:

   
   
   
   



   2、核心类JdbcTemplate
a.基于模板的设置(为什么可以设置成基于模板的形式)
b.完成了资源的创建和释放的工作
c.简化为我们对JDBC的操作
d.完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行
f.仅需要传递DataSource就可以把它实例化
g.JdbcTemplate只需要创建一次
h.JdbcTemplate是线程安全类


   3、使用JdbcTemplate


方式一:(麻烦)
在Dao类中,用JdbcTemplate作为属性,用spring对JdbcTemplate进行注入。再对JdbcTemplate进行DataSource注入。













方式二:继承JdbcDaoSupport(简单)
      在Dao类中,继承JdbcDaoSupport。因为JdbcDaoSupport已经有了JdbcTemplate的引用,所以只要继承JdbcDaoSupport就相当于有了JdbcTemplate属性。
然后在注入Datasource(Dao类中不需要自己维护Datasource?c从父类继承下来)









Dao类中jdbc操作中RowMapper的使用:(可以将ResultSet里的数据封装在一个持久的javaBean中)

1.写一个类实现RowMapper   public class AccountMapper implements RowMapper{}
2.在回调接口中,作为参数进行传入即可
this.getJdbcTemplate().query(sql,new AccountMapper);


   4、HibernateTemplate模板
1、如果一个DAO类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了。
2、如果一个DAO类没有继承HibernateDaoSupport,需要有一个HibernateTemplate的属性,在spring配置中注入SessionFactory。




*********Spring+Hibernate(配置)**********************************************





classpath:hibernate.cfg.xml












com/itheima12/spring/hibernate/transaction/domain





org.hibernate.dialect.MySQL5InnoDBDialect
true
update





七、Spring的事务管理器**************************************************************
spring的声明式事务处理:(让程序员不再关注事务)(只有事务管理器配置不一样)

     声明:由程序告诉spring容器,什么样的目标方法采用什么样的事务策略

     事务处理:是由spring容器来完成的

     crud操作:程序员做的事情
PlatformTransactionManager-->AbstractPlatformTransactionManager-->DataSourceTransactionManager/HibernateTransactionManager




需要引入名称空间(如下)+aop的名称空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

***Spring+JDBC的事务管理器的配置方法***


   2.配置jdbc的事务管理器





   3.配置通知

   
//基本都是这种

   




   4.配置切入点






   注解形式:
1.

2.

     
     
     
     

3.





4.



5.



***Spring+Hibernate的事务管理器的配置***


需要在web中:


openSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter


openSessionInViewFilter
/*



   XML配置形式:
















expression="execution(* com.itheima12.spring.hibernate.transaction.service.impl.*.*(..))" 
id="perform"/>



   注解形式:
1.

2.

     
     
     
     

3.







com/itheima12/spring/hibernate/transaction/domain





org.hibernate.dialect.MySQL5InnoDBDialect
true
update



4.



4.





5.



eg:service层注解形式:
@Transactionl(readOnly=true)
public class BusinessServiceImpl{

@Transactionl(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)
public void save(){}
}
解释:方法的事务设置将被优先执行。
-------------------------------------------------------------HibernateCallback(Spring的回调接口)------------------------------------------
eg: hibernateTemplate.execute(new HibernateCallback() {


@Override//可以得到session 可以在做你想做的事
public T doInHibernate(Session session) throws HibernateException,
SQLException {

return T;
}
});

你可能感兴趣的:(Java)