829 早上 Spring-2cp IOC/DI 下午Sping-3 AOP (较乱)

文档提示

sts

 

 

 

 

 

 

 

 

 

核心jar包

强大的功能:

AOP 面向切面编程    Aspects 

 

 

测试类编写过程:

1.创建spring容器

2.从容器里获取Bean组建

或获取service组件

3.

 

entity 实体类

dao层接口 操纵数据库

dao.impl 接口实现类 implements 

service逻辑层 接口 

service.impl接口实现类 重写service层的方法

(都是new一个UserDao的实现类的对象)

test 测试类:

添加dao层,UserDaoImpl组件和service组件

 

 

 

使用注解的方式

 

 

配置注解(简化配置)

 

安装核心ide

 

https://mvnrepository.com/

去maven下载对应的版本

mvnrepository.com

 

Spring-3下午

 

编写全局配置文件

 

修改UserServiceLogger.java

定义好要处理的切面表达式

前置方法

 

早上与下午的对比图

全局配置

 

实体类一致

package com.entity;

public class User {
	private int id;
	private String userName;
	private String password;
	private String email;
	public User() {}
	
	
	public User(int id, String userName, String password, String email) {
		super();
		this.id = id;
		this.userName = userName;
		this.password = password;
		this.email = email;
	}


	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}


	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", email=" + email + "]";
	}

	
}

 

dao层一致

package com.dao;

import com.entity.User;

public interface UserDao {
	public int saveUser(User user);
}

 

dao层的实现类impl一致

package com.chinasofti.dao.impl;

import org.springframework.stereotype.Repository;

import com.chinasofti.dao.UserDao;
import com.chinasofti.entity.User;
//使用注解注册dao层组件,名称为userDao
@Repository("userDao")
public class UserDaoImpl implements UserDao {

	@Override
	public int saveUser(User user) {
		System.out.println("向数据库中插入一条数据...");
		System.out.println(user);
		return 0;
	}

}

 

service一致

package com.service;

import com.entity.User;

public interface UserService {
	public boolean saveUser(User user);
}

 

service的实现类impl一致

package com.chinasofti.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.chinasofti.dao.UserDao;
import com.chinasofti.entity.User;
import com.chinasofti.service.UserService;
//注册业务逻辑层组件  名称为userService
@Service("userService")
public class UserServiceImpl implements UserService {
	//自动注入名称userDao的组件
	@Autowired
	@Qualifier("userDao")
	private UserDao userDao;
	
	@Override
	public boolean saveUser(User user) {
		
		return userDao.saveUser(user)==1?true:false;
	}

}

 

测试类一致

package com.chinasofti.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.chinasofti.entity.User;
import com.chinasofti.service.UserService;

public class SpringTest {

	@Test
	public void test() {
		//创建spring容器pring 
		ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
		//从容器中获取service组件
		UserService userService = context.getBean(UserService.class);
		//User user = new User(1, "AA", "123456", "AA@qq.com");
		User user = (User) context.getBean("user");
		userService.saveUser(user);	
	}

}

 

AOP多一个com.logger

package com.chinasofti.logger;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
//注册为切面
@Aspect
public class UserServiceLogger {
	private  static final Logger log = Logger.getLogger(UserServiceLogger.class);
	//定义好要处理的切面表达式(定义的切点)
	@Pointcut(value="execution(* com.chinasofti.service..*.*(..))")
	public void pointcut() {}
	//前置方法 
	@Before(value="pointcut()")
	public void before(JoinPoint point) {
		log.info(this.getClass().getSimpleName()+":调用"+point.getTarget()+"的"+point.getSignature().getName()+"方法,参数列表为:"+Arrays.toString(point.getArgs()));
	}
}

 

IOC/DI运行结果

 

AOP运行结果

 

IOC/DI与AOP概念的理解:

IOC,控制反转的意思,DI是依赖注入


      所谓控制反转,即依赖关系的获取方式(controll)反过来了。所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓反转(inversion),你必须理解如果不反转,会怎么着,因为A必须要有B,才可以调用B,如果不反转,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。
      所以,不反转,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了反转的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。

      形象的举例就是:

      通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!

      这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?

      解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:
      第一:向小卖部注册为会员
      第二:告诉小卖部你需要什么

是不是和Spring的做法很类似呢?Spring就是小卖部,你就是A对象,水就是B对象
      第一:在Spring中声明一个类:A
      第二:告诉Spring,A需要B

假设A是UserAction类,而B是UserService类
<bean id="userService" class="org.leadfar.service.UserService"/>
<bean id="documentService" class="org.leadfar.service.DocumentService"/>
<bean id="orgService" class="org.leadfar.service.OrgService"/>

<bean id="userAction" class="org.leadfar.web.UserAction">
     <property name="userService" ref="userService"/>
</bean>

      在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:

package org.leadfar.web;
public class UserAction{
     private UserService userService;
     public String login(){
          userService.valifyUser(xxx);
     }
     public void setUserService(UserService userService){ 
          this.userService = userService;
     }
}

在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!)

Spring依赖注入的实现技术是:动态代理

 

AOP

 

      再说说AOP,即面向切面编程,面向切面编程的目标就是分离关注点。什么是关注点呢,就是你要做的事,就是关注点。假如你是个公子哥,没啥人生目标,天天就是衣来伸手,饭来张口,整天只知道玩一件事!那么,每天你一睁眼,就光想着吃完饭就去玩(你必须要做的事),但是在玩之前,你还需要穿衣服、穿鞋子、叠好被子、做饭等等等等事情,这些事情就是你的关注点,但是你只想吃饭然后玩,那么怎么办呢?这些事情通通交给别人去干。在你走到饭桌之前,有一个专门的仆人A帮你穿衣服,仆人B帮你穿鞋子,仆人C帮你叠好被子,仆人C帮你做饭,然后你就开始吃饭、去玩(这就是你一天的正事),你干完你的正事之后,回来,然后一系列仆人又开始帮你干这个干那个,然后一天就结束了!

      AOP的好处就是你只需要干你的正事,其它事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也许有一天,出门之前你还想带点钱,那么你再雇一个仆人D专门帮你干取钱的活!这就是AOP。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。

      从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!
 ———————————————— 
版权声明:本文为CSDN博主「YJCK」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/li_tengfei/article/details/6106317

 

 

后置的注解

 

 

DaoImpl:数据库的增删改查

ServiceImpl:业务逻辑,返回值啊之类的

控制层:页面跳转

 

 

 

抛出异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一身正气z

打赏随心就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值