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>