原文链接:http://blog.csdn.net/qq_22329521/article/details/75000091
第一步导包
配置约束
在src下创建applicationContext.xml文件
创建对象
public class User {
private String name;
private Integer age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void init(){
System.out.println("init");
}
public void destory(){
System.out.println("destory");
}
}
public class UserFactory {
public static User createUser(){
return new User();
}
public User createUser2(){
return new User();
}
}
@Test
public void fun1(){
//1.创建容器
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.向容器要user对象(第一种)
User user = (User) ac.getBean("user");
//2.向容器要user对象(第二种)
User user = (User) ac.getBean("user1");
//2.向容器要user对象(第三种)
User user = (User) ac.getBean("user2");
//打印user
System.out.println(user);
//容器关闭
ac.close();
}
属性注入
(set方法注入)
构造函数注入
//为了避免有多个构造函数指定不了映入index和type
tom
jack
1
2
utf-8
8m
public class User {
private String name;
private Integer age;
private Car car;
public User() {
System.out.println("无参构造函数");
}
public User(String name, Integer age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
public User(String name, Car car) {
System.out.println("User(String name, Car car)!!");
this.name = name;
this.car = car;
}
public User(Car car,String name) {
System.out.println("User(Car car,String name)!!");
this.name = name;
this.car = car;
}
public User(Integer name, Car car) {
System.out.println("User(Integer name, Car car)!!");
this.name = name+"";
this.car = car;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setCar(Car car) {
this.car = car;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class Car {
public String name;
public String color;
public Car() {
}
public Car(String name, String color) {
this.name = name;
this.color = color;
System.out.println("car ");
}
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
}
public class CollectionBean {
private Object[] arr;
private List list;
private Map map;
private Properties properties;
public Object[] getArr() {
return arr;
}
public void setArr(Object[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "CollectionBean{" +
"arr=" + Arrays.toString(arr) +
", list=" + list +
", map=" + map +
", properties=" + properties +
'}';
}
}
@Test
public void fun4(){
//1.创建容器
ApplicationContext ac=new ClassPathXmlApplicationContext("com/fmt/spring/test/applicationContext.xml");
//2.向容器要user对象
User user = (User) ac.getBean("user");
//打印user
System.out.println(user);
}
注解
注解是为了代替配置
//
aop
public interface UserInterface {
void save();
void delete();
void update();
void find();
}
public class UserInterfaceImpl implements UserInterface {
@Override
public void save() {
System.out.println("save");
}
@Override
public void delete() {
System.out.println("delete");
}
@Override
public void update() {
System.out.println("update");
}
@Override
public void find() {
System.out.println("find");
}
}
public class MyAdvice {
//前置通知:目标方法运行之前调用
public void before(){
System.out.println("前置通知");
}
//后置通知,如果方法出现异常不会调用
public void afterReturn(){
System.out.println("后置通知");
}
//环绕通知,方法之前之后都会调用
public void around(ProceedingJoinPoint pjp){
System.out.println("环绕通知之前的部分");
try {
pjp.proceed();//调用目标方法
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("这是后置通知(如果出现异常不会调用)!!");
}
//异常通知
public void afterException(){
System.out.println("异常时调用");
}
//后置通知出现异常也会调用
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/fmt/spring/springaop/applicationContext.xml")
public class DemoTest {
@Resource(name= "userServiceTarget")
private UserInterface us;
@Test
public void fun1(){
us.save();
}
}
注解配置
//通知类
@Aspect
//表示该类是通知类
public class MyAdvice {
//前置通知:目标方法运行之前调用
@Before("execution(* com.fmt.spring.service..*InterfaceImpl.*(..))")
public void before(){
System.out.println("前置通知");
}
//后置通知,如果方法出现异常不会调用
@AfterReturning("execution(* com.fmt.spring.service..*InterfaceImpl.*(..))")
public void afterReturn(){
System.out.println("后置通知");
}
//环绕通知,方法之前之后都会调用
@Around("execution(* com.fmt.spring.service..*InterfaceImpl.*(..))")
public void around(ProceedingJoinPoint pjp){
System.out.println("环绕通知之前的部分");
try {
pjp.proceed();//调用目标方法
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("这是后置通知(如果出现异常不会调用)!!");
}
//异常通知
@AfterThrowing("execution(* com.fmt.spring.service..*InterfaceImpl.*(..))")
public void afterException(){
System.out.println("异常时调用");
}
//后置通知出现异常也会调用
@After("execution(* com.fmt.spring.service..*InterfaceImpl.*(..))")
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
}
}
在xml中只需要配置
JDBC
@Test
public void fun1(){
//准备连接池
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
try {
comboPooledDataSource.setDriverClass("com.jdbc.mysql.jdbc.Driver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
comboPooledDataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("123456");
//创建JDBC末班对象
JdbcTemplate jt=new JdbcTemplate();
jt.setDataSource(comboPooledDataSource);
//书写sql语句
String sql="insert into t_user values(null,'rose')";
jt.update(sql);
}
xml配置
public class UserDaoImp implements UserDao {
private JdbcTemplate jt;
@Override
public void save(User user) {
String sql="insert into t_user values(null,?)";
jt.update(sql,user.name);
}
@Override
public void find(Integer id) {
String sql="select * from t_user where id=?";
jt.queryForObject(sql, (resultSet, i) -> {
User user = new User();
user.id=resultSet.getInt("id");
user.name=resultSet.getString("name");
return user;
}, id);
}
@Override
public void delete(Integer id) {
String sql="delete from t_user where id=?";
jt.update(sql,1);
}
@Override
public void update(User user) {
String sql="update t_user set name=? where id=? ";
jt.update(sql,user.name,user.id);
}
@Override
public int getTotalCount() {
String sql="select count(*) from t_user";
Integer integer = jt.queryForObject(sql, Integer.class);
return integer;
}
@Override
public List getUserAll() {
String sql="select * from t_user";
List list = jt.query(sql, new RowMapper() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.id = resultSet.getInt("id");
user.name = resultSet.getString("name");
return user;
}
});
return list;
}
public void setJt(JdbcTemplate jt) {
this.jt = jt;
}
public JdbcTemplate getJt() {
return jt;
}
}
@Test
public void fun2(){
//准备连接池
User user = new User();
user.name="xxx";
userDao.delete(1);
}
JdbcDaoSupport
public class UserDaoImp extends JdbcDaoSupport implements UserDao {
@Override
public void save(User user) {
String sql="insert into t_user values(null,?)";
super.getJdbcTemplate().update(sql,user.name);
}
}
读取配置文件
db.properties
jdbc.jdbcUrl=jdbc:mysql:///jdbctest
jdbc.driverClass=com.jdbc.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123456
事务
private TransactionTemplate transactionTemplate;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
private AccountDao ad;
@Override
public void transfer(Integer from, Integer to, Double money) {
//事务操作
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
ad.decreaseMoeny(from,money);
ad.addMoney(to,money);
}
});
}
xml配置事务
注解配置
非常非常容易
xml中加入
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED)
public class AcountServiceImp implements AcountService{
public void setAd(AccountDao ad) {
this.ad = ad;
}
private AccountDao ad;
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void transfer(Integer from, Integer to, Double money) {
ad.decreaseMoeny(from,money);
int i=20/0;
ad.addMoney(to,money);
}
}
SSH整合
- spring与struct2整合,是将action对象 交给spring容器负责创建
- spring与hibernate整合,是将sessionFactory交给spring来负责维护spring,来维护以及aop事务
基本目录结构
Spring整合struts2
配置 web.xml
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
struts.xml
/hehe.jsp
//此处是spring手动配置,需要在上方struts.xml中配置class="userAction" ,如果class设置为包名+类名,此处可以不配置,但是如果要把UserServiceImp加载进来,bean中的name需要和userAction中的 UserService 名字相同
public class UserAction extends ActionSupport{
private UserService us;
public void setUs(UserService us) {
this.us = us;
}
@Override
public String execute() throws Exception {
System.out.println(us);
return super.execute();
}
}
配置到这访问http://localhost:8080/UserAction_execute 看是否成功
spring 整合hibernate
hibernate.cfg.xml
com.mysql.jdbc.Driver
jdbc:mysql:///jdbctest
root
123456
org.hibernate.dialect.MySQLDialect
true
true
update
applicationContext.xml
com.mysql.jdbc.Driver
jdbc:mysql:///jdbctest
root
123456
org.hibernate.dialect.MySQLDialect
true
true
update
public class User {
/*
* CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
*/
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
public Long getUser_id() {
return user_id;
}
public void setUser_id(Long user_id) {
this.user_id = user_id;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String user_password) {
this.user_password = user_password;
}
public Character getUser_state() {
return user_state;
}
public void setUser_state(Character user_state) {
this.user_state = user_state;
}
@Override
public String toString() {
return "User [user_id=" + user_id + ", user_code=" + user_code + ", user_name=" + user_name + ", user_password="
+ user_password + "]";
}
}
User.hbm.xml
测试Hibernate配置是否成功
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class HibernateTest {
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
@Test
public void fun1(){
Configuration conf=new Configuration();
conf.configure();
Session session = conf.buildSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUser_code("tom");
user.setUser_name("tom");
user.setUser_password("1234");
session.save(user);
transaction.commit();
session.close();
}
@Test
public void fun2(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUser_code("jack");
user.setUser_name("jack");
user.setUser_password("1234");
session.save(user);
transaction.commit();
session.close();
}
@Test
public void fun3(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setUser_code("jock");
user.setUser_name("jock");
user.setUser_password("1234");
session.save(user);
transaction.commit();
session.close();
}
}
添加连接池
创建db.properties
jdbc.jdbcUrl=jdbc:mysql:///jdbctest
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=1234
修改applicationContext
org.hibernate.dialect.MySQLDialect
true
true
update
使用HibernateDaoSupport
//为HibernateDaoSupport 注入sessionFactory
public class UserServiceImp extends HibernateDaoSupport implements UserService{
@Override
public User getUserByCodePassWord(String pwd) {
// //hql
// return getHibernateTemplate().execute(session -> {
// String hql="from User where user_code=?";
// Query query = session.createQuery(hql);
// query.setParameter(0,pwd);
// User user = (User) query.uniqueResult();
// return user;
// });
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.add(Restrictions.eq("user_code",pwd));
List criteria = (List) getHibernateTemplate().findByCriteria(detachedCriteria);
if (criteria!=null&&criteria.size()>0){
return criteria.get(0);
}
return null;
}
}
事务aop
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = true)
public class UserServiceImp extends HibernateDaoSupport implements UserService{
}
扩大session作用范围
在web.xml
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
openSessionInView
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
openSessionInView
/*
struts2
/*