複習spring基本操作

spring也好久沒用了,先複習一下spring的基本用法,然後去看源碼吧,我已經把spring常用操作寫成demo上傳到碼雲了,還有什麼功能想到就加上,點這個進入碼雲,這篇文章就水一下吧

在這裏插入圖片描述
example層

package example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.User;

public class 在Java中獲取bean {
    public static void main(String[] args) {
        //創建應用上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        //通過bean的name或class對象獲取對應的bean對象
//        User u=context.getBean(User.class);
        User u=(User) context.getBean("user");
        System.out.println(u.getName());
    }
}

package example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import pojo.User;

@Controller
public class 指定自動注入的bean {
    //自動注入
    @Autowired
    //指定自動注入的bean的name
    @Qualifier("u")
    User user;
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        System.out.println(context.getBean(指定自動注入的bean.class).user.getName());
    }
}
package example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import pojo.User;

@Controller
public class 使用自動注入獲取bean {
    //自動注入
    @Autowired
    User user;
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        System.out.println(context.getBean(使用自動注入獲取bean.class).user.getName());
    }
}

package example;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

@Aspect//註解爲切面
@Controller
public class 使用aop {
    //可以使用@Pointcut將該方法綁定爲切點定義方法,以替代繁瑣的定義
    @Pointcut("execution(* example.使用aop.AopTest.test(..))")
    public void Pointcut(){}

    //可以通過args(id)的方式獲取傳入參數
    //前置通知
    @Before("Pointcut()&&args(id)")
    public void before(String id){
        System.out.println("前置通知,傳入參數爲:"+id);
    }

    //定義切點,後置通知
    @After("Pointcut()")
    public void after(){
        System.out.println("後置通知");
    }

    //定義切點,正常執行通知
    @AfterReturning("Pointcut()")
    public void afterReturning(){
        System.out.println("正常執行通知");
    }

    //定義切點,異常結束通知
    @AfterThrowing("Pointcut()")
    public void afterThrowing(){
        System.out.println("異常結束通知");
    }

    //環繞通知
    @Around("Pointcut()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable{
        try {
            System.out.println("環繞前置通知");
            Object[] objects = joinPoint.getArgs();//獲取傳入參數
            for (Object o : objects)//打印傳入參數
                System.out.println("環繞通知,打印傳入參數:"+o);
            joinPoint.proceed();//執行下一個通知或目標方法
            System.out.println("環繞後置通知");
            System.out.println("環繞通知正常執行通知");
        }catch (Exception e){
            System.out.println("環繞通知異常結束通知");
        }
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        context.getBean(AopTest.class).test("test");
    }
    @Controller
    /**
     * 測試類
     */
    public class AopTest {
        void test(String id){

        }
    }
}

package example;

import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import pojo.User;

@Controller
public class 配置事務 {
    @Autowired
    UserDao userDao;
    //發生任何異常都回滾,事務時間超過十秒(該10秒僅爲sql執行時間,sleep無效)回滾
    @Transactional(rollbackFor = Exception.class, timeout = 10)
    public void addUser(User user) throws Exception {
        userDao.addUser(user);
//        if(true)
//            throw new Exception();
    }

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        User user=new User();
        user.setName("hh");
        try {
            context.getBean(配置事務.class).addUser(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

dao層

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">
    <resultMap id="BaseResultMap" type="pojo.User">
        <id column="name" property="name" />
    </resultMap>
    <insert id="addUser" parameterType="pojo.User">
        insert into user(name)values(#{name})
    </insert>
</mapper>
package dao;

import pojo.User;

/**
 * sql
 * CREATE TABLE user  (
 *   `name` varchar(255) NULL
 * );
 */
public interface UserDao {
    /**
     * 添加用戶
     */
    void addUser(User user);
}

pojo層

package pojo;

public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

配置文件

jdbc.driver= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://60.205.216.134:3306/xx
jdbc.name= xx
jdbc.pwd= 1234
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
        <mapper resource="dao/UserDao.xml"/>
    </mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <context:property-placeholder location="classpath:application.properties"/>
    <!--開啓註解掃描-->
    <context:annotation-config/>
    <!-- 配置容器資源掃描的包 -->
    <context:component-scan base-package="example"/>
    <!--開啓aop註解掃描-->
    <aop:aspectj-autoproxy/>
    <bean class="pojo.User" name="user">
        <property name="name" value="1234"/>
    </bean>
    <bean class="pojo.User" name="u">
        <property name="name" value="666"/>
    </bean>
    <!--aop:xml配置-->
    <aop:config>
        <!--範圍-->
        <aop:pointcut expression="execution(* example.使用aop.AopTest.test(..))" id="pointcut"/>
        <!--切面類-->
        <aop:aspect ref="使用aop">
            <!--前置通知-->
            <!--暫時無法解決傳入參數的問題,略過-->
            <!--<aop:before method="before" pointcut-ref="pointcut"/>-->
            <!--後置通知-->
            <aop:after method="after" pointcut-ref="pointcut"/>
            <!--正常結束通知-->
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut"/>
            <!--異常結束通知-->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut"/>
            <!--環繞通知-->
            <aop:around method="around" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
    <!--配置連接池對象:Connection-->
    <bean id="dateSource" class="com.mchange.v2.c3p0.DriverManagerDataSource">
        <property name="user" value="${jdbc.name}"/>
        <property name="password" value="${jdbc.pwd}"/>
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
    </bean>
    <!--SqlSessionFactory對象:負責對Connection進行包裝生成SqlSession-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--把連接池交給該對象-->
        <property name="dataSource" ref="dateSource"/>
        <!--加載mybatis主配置文件-->
        <property name="configLocation" value="classpath:mybatis.cfg.xml"/>
    </bean>
    <!--配置自動生成接口實現類的對象,並且註冊到IOC容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--把SqlSessionFactory對象交給該對象-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--指定dao層接口所在的位置-->
        <property name="basePackage" value="dao"/>
    </bean>
    <!--定義事務管理器-->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dateSource"></property>
    </bean>
    <!-- 開啓事務註解@Transactional支持 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章