spring使用大全

  1. spring 使用目的
    个人理解:容器,或者一个池,把所有对象(bean)集合起来,别人需要使用的时候,问spring要,spring给,房屋中介是不是更加形象?

  2. spring两个特性及底层原理
    使用的时候必须有命名空间等
    这里写图片描述
    (1)控制反转、依赖注入,bean池
    将创建对象的权利交给spring,完成控制权的翻转,不再利用new关键字创建对象,而是使用spring利用反射技术创建对象。
    创建对象的时候,进行注入,比如service里面使用dao,在配置文件中将dao注入到service中。
    (2)事务管理
    声明式事务和基于注解的事务管理。声明式事务就是利用动态代理及面向切面编程AOP在配置文件中进行事务的配置,主要是切入点、增强类、传播域、事务类型。
    基于注解的方式是使用关键字 @Transactional在方法上声明一下。

  3. 基于配置文件的spring
    即所用的bean、事务管理全部在xml中进行配置。
    (1)bean

 <beans>
 <bean id="",class="",name="">
 <property name="",value=""/>
 或者
<constructor-arg name="",value=""/>
 </bean>
 </beans>

其中id唯一标识bean,class是bean所在类,name 是id的别名,但是唯一标识一个bean的是id,而不是name.
bean使用大全
bean是啥
依赖注入
(2)反射原理实现bean
//首先会先通过dom4j解析该id属性得到该id字符串
//然后在解析class属性得到class的全名
String idStr=…;
String classStr=…;
//通过反射创建实体对象
Class clazz=Class.forName(classStr);
Object obj=clazz.newInstance();
//spring容器存放该对象,以id为key
container.put(idStr,obj);
bean底层原理

(3)事务管理AOP

编程式事务管理

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

 <!--配置事务管理的模板-->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"></property>
        <!--定义事务隔离级别,-1表示使用数据库默认级别-->
        <property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
    </bean>

声明式事务管理

<tx:advice id="advice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert" propagation="REQUIRED" read-only="false"  rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointCut" expression="execution (* com.gray.service.*.*(..))"/>
        <aop:advisor advice-ref="advice" pointcut-ref="pointCut"/>
    </aop:config>

基于@Transactional注解 `

<!-- 声明式事务管理 配置事物的注解方式注入-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    @Transactional(rollbackFor=Exception.class)
    public void insert(String sql, boolean flag) throws Exception {
        dao.insertSql(sql);
        // 如果flag 为 true ,抛出异常
        if (flag){
            throw new Exception("has exception!!!");
        }
    }

(4)AOP原理
利用接口接口反射

public class TxHandler implements InvocationHandler {
private Object originalObject;
public Object bind(Object obj) {
 this.originalObject = obj;
 return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
 Object result = null;
 if (!method.getName().startsWith("save")) {
  UserTransaction tx = null;
  try {
   tx = (UserTransaction) (new InitialContext().lookup("java/tx"));
   result = method.invoke(originalObject, args);
   tx.commit();
  } catch (Exception ex) {
   if (null != tx) {
    try {
     tx.rollback();
    } catch (Exception e) {
   }
  }
 }
} else {
 result = method.invoke(originalObject, args);
}
return result;
}
}

spring的两种动态代理
5. spring的注解类型
(1)@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
(2)@Service对应表现层的Bean,也就是Service

@Service
public class AServiceImpl implements AService {

(3)@Repository对Dao进行注解
(4)service 层使用@Resource注入Dao,byName
(5)@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
(6)@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,我们也要清楚,@Autowired是根据类型进行自动装配的。
Spring注解

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/80882648
今日推荐