Spring _day02_IoC注解开发入门
1、Spring IoC注解开发入门
1.1 注解开发案例:
创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包
① 在src下编写applicationContext.xml配置文件,进行注解开发需要引入context约束
<?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="h ttp://www.springframework.org/schema/context" 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">
<!--组建扫描:哪些包下的类要使用IOC注解 [使用了context包]-->
<context:component-scan base-package="com.simon.spring.*"></context:component-scan>
</beans>
② 给目标类加注解并完成注解方式的属性注入,可以没有set方法 @Value()
* 属性如果有set方法,需要将属性注入的注解加到set方法上
* 属性如果没有set方法,需要将注解添加到属性上
@Component(value = "userdao")
public class UserDaoImpl implements UserDao{
@Value("simon")
String user_name;
public void setUser_name(String user_name) {
this.user_name = user_name;
}
@Override
public void say() {
System.out.println("UserDao is precessing..."+user_name);
}
}
③ service测试:
@Test
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("config/applicationContext.xml");
UserDao userdao = (UserDao) applicationContext.getBean("userdao");
userdao.say();
}
1.2 Spring的IoC注解详解:
1.2.1@Component:组件
- 修饰一个类,表示将这个类交给Spring管理
- 这个类有三个衍生注解:修饰类
@Service : web层
@controller : service层
@Repository :dao层
1.2.2属性注入的注解
- 普通属性 :使用@Value()注解
引用属性: 使用@Autowired(),是按照类型进行注入的;
@Autuwired()+@Qulifier()会按照名称进行注入
spring实现的一套规范接口里提供了一个替代注解:@Resource() --按照名称进行注入提供一个User类,将User的一个对象注入到UserDaoImpl 的属性里面去
@Component("user111")
public class User {@Value("Simon") String name; @Value("男") String sex; @Value("19") Integer age; @Override public String toString() { return "User{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; }
}
UserDaoImpl:
@Component(value = "userdao")
public class UserDaoImpl implements UserDao{
@Value("Daniel")
String user_name;
// @Autowired
// @Qualifier("user111")
@Resource("user111")
User user;
public void setUser_name(String user_name) {
this.user_name = user_name;
}
@Override
public void say() {
System.out.println("UserDao is precessing..."+user_name+"...."+user);
}
}
1.3、Bean的其他注解
1.3.1初始化方法以及在工厂被关闭时执行的方法 : 【生命周期的注解配置】
@PostConstruct //相当于<bean id=" class=" init-method="init">
public void init(){
System.out.println("Userdao 被初始化了。。。");
}
public void save(){
System.out.println("Userdao 正在执行save()方法。。。");
}
@PreDestroy //相当于<bean id=" class=" init-method="destory">
public void destory(){ //工厂关闭时才会执行
System.out.println("Userdao 被销毁了。。。");
}
1.3.2Bean的作用范围的注解:
@Scope : 【加在类上】
singleton :默认的,Spring 会采用单例模式创建这个对象。
prototype :多例模式。(Struts2和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
1.4 IoC的XML和注解的开发比较:
- 适用场景:
- XML:可以适用任何场景 ==》结构清晰,后期维护方便
- 注解:有些地方用不了,这类不是自己提供的 ==》开发方便
1.5 XML和注解整合开发:
使用XML管理Bean,使用注解完成属性注入
使用前先打开注解方式配置:【包扫描时配置在类上的】
<context:annotation-config></context:annotation-config> <!--允许使用注解的方式注入-->
<bean id="productService" class="com.simon.spring.demo.ProductService"></bean>
<bean id="orderDao" class="com.simon.spring.demo.OrderDao"></bean>
测试:在ProductService中注入OrderDao
public class ProductService {
@Autowired
private OrderDao dao;
public void save(){
dao.save();
System.out.println("ProductService....");
}
}
2、Spring Aop的开发(AspectJ的XML的方式)
AOP思想最早由AOP联盟提出,Spring是使用这种思想最好的框架 。
Spring的AOP有自己的实现方式(非常繁琐)。AspectJ是一个AOP框架,Spring引入AspectJ作为自身的 AOP开发
AOP采取横向抽取机制,取代了传统的纵向集成机制 横向抽取采用动态代理实现
Spring AOP底层原理就是动态代理:
- JDK 动态代理 :只能对实现了接口的类产生代理
- CGLIB动态代理(类似javassist的第三方技术) : 对没有实现接口的类产生代理对象,==》生成子类对象
2.1 JDK动态代理示例
2.2 CGLIB动态代理示例
2.3 AOP的相关技术名词 :
- Joinpoint:连接点,可以被拦截增强的点都可以被称作连接点
- Pointcut:切入点,真正被拦截增强的点
- Advice:通知/增强,比如要对save()进行权限校验,权限校验的方法就是通知,是方法层面的增强
- Introduction:引介。类层面的增强,在类中动态的增加一个方法
- Target:目标,就是被增强的对象(类:例如UserDao)
- Weaving:织入,代表一个过程,将通知(Advice)应用到目标(Target)上的过程叫做织入
- Proxy:代理对象,被增强后产生的对象
- Aspect:切面,多个通知和多个切入点的组合叫做切面
2.4开发案例:
引入jar包:六个基本的jar包之外,还需要四个:依赖库中AOP联盟包、aspectj的包,Spring中Aop的包,spring和Aspect整合的包
引入约束:
<!--将切面类交给Spring管理--> <bean id="myaspect" class="com.simon.spring.demo2.MyAspectXML"></bean> <!--通过AOP的配置完成对目标类的增强--> <aop:config> <!--表达式配置哪些类的哪些方法需要进行增强--> <aop:pointcut id="pointcut1" expression="execution(* com.simon.spring.demo2.UserDaoImpl.save(..))" ></aop:pointcut> <!--配置切入点--> <aop:aspect ref="myaspect"> <aop:before method="check" pointcut-ref="pointcut1"></aop:before> </aop:aspect> </aop:config>
引入Spring包中的test包可进行spring和junit的整合开发
Advice:public class MyAspectXML {
public void check(){
System.out.println("权限校验~~~");
}
}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:config/aspect.xml")
public class SpringDemo1 {
@Autowired
private UserDao dao;
@Test
public void test1(){
dao.save();
}
}
2.5 通知的类型
前置通知:在目标方法执行之前进行操作
后置通知:在目标方法执行之后进行操作,可以获得方法的返回值
环绕通知:在目标方法执行前后进行操作
异常抛出通知:程序出现异常时候进行的操作
最终通知:无论代码出不出错,最终都会执行的方法
示例:
<!--1.配置目标对象:被增强的对象-->
<bean id="userdaoImpl" class="com.simon.spring.demo2.UserDaoImpl"></bean>
<!--将切面类交给Spring管理-->
<bean id="myaspect" class="com.simon.spring.demo2.MyAspectXML"></bean>
<!--通过AOP的配置完成对目标类的增强-->
<aop:config>
<!--表达式配置哪些类的哪些方法需要进行增强-->
<aop:pointcut id="pointcut1" expression="execution(* com.simon.spring.demo2.UserDaoImpl.save(..))" ></aop:pointcut>
<aop:pointcut id="pointcut2" expression="execution(* com.simon.spring.demo2.UserDaoImpl.delete(..))" ></aop:pointcut>
<aop:pointcut id="pointcut3" expression="execution(* com.simon.spring.demo2.UserDaoImpl.update(..))" ></aop:pointcut>
<aop:pointcut id="pointcut4" expression="execution(* com.simon.spring.demo2.UserDaoImpl.find(..))" ></aop:pointcut>
<!--配置切入点-->
<aop:aspect ref="myaspect">
<!--前置通知:-->
<aop:before method="check" pointcut-ref="pointcut1"></aop:before>
<!--后置通知:-->
<aop:after-returning method="log" pointcut-ref="pointcut2" returning="result"></aop:after-returning>
<!--环绕通知-->
<aop:around method="around" pointcut-ref="pointcut3"></aop:around>
<!--异常抛出通知-->
<aop:after-throwing method="afterthrowing" pointcut-ref="pointcut4" throwing="ex"></aop:after-throwing>
<!--最终通知-->
<aop:after method="after" pointcut-ref="pointcut4"></aop:after>
</aop:aspect>
</aop:config>
各个通知:
public class MyAspectXML {
//前置通知
public void check(){
System.out.println("前置通知~~~");
}
//后置通知 ===》切入点可能有返回值,记成Object类型
public void log(Object result){
System.out.println("后置通知。。。"+result);
}
//环绕通知 ===》传入连接点
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕前通知。。。");
Object proceed = point.proceed();
System.out.println("环绕后通知。。。");
return proceed;
}
//异常抛出通知 ===接收异常信息,参数名和XML配置的一致
public void afterthrowing(Throwable ex){
System.out.println("异常通知" + ex);
}
//最终通知
public void after(){
System.out.println("最终通知。。。。");
}
}
测试案例:
@Test
public void test1(){
dao.save();
dao.delete();
dao.update();
dao.find();
}
2.5.Spring的切入点表达式写法
- 基于excution的函数完成的
- 语法:了解。。。
Spring _day02_IoC注解开发入门的更多相关文章
- Spring MVC注解开发入门
注解式开发初步 常用的两个注解: @Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求.标识当前 ...
- Spring的IOC注解开发入门1
基本知识点如下: 引入注解约束,配置组件扫描 类上的注解: @Conponent @Controller @Service @Repository 普通属性的注解 @value 对象属性的注解 ...
- spring原始注解开发-01
我们使用xml-Bean标签的配置方式和注解做对比理解 1.创建UserDao接口以及UserDao的实现类UserDaoImpl(接口代码省略) public class UserDaoImpl i ...
- Spring使用注解开发及使用java类进行配置bean
Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...
- SpringMVC的注解开发入门
1.Spring MVC框架简介 支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器(HttpMessageConverter) 和数据转换.格式化.验证框架无缝集成 ...
- Spring基于注解开发异常
基于注解开发: 一开始:用的jar包: 百度查到: 导入aop包: 没用 有的说: Spring版本和jdk版本不匹配 于是我换成了4.0版本 导入的jar包: 还是报错. 解决办法:添加spring ...
- spring——使用注解开发
注意:spring4之后,使用注解开发需要导入AOP包org.springframework:spring-aop:5.2.5.RELEASE以及context约束,增加注解的支持 <?xml ...
- Spring的IOC注解开发入门2
注解方式设置属性的值 在我们IOC基于xml属性注入的方式中有(一般推荐set方法) 构造方法注入普通值:<constructor-arg>的使用 set方法注入普通值:<prope ...
- Spring的AOP开发入门,Spring整合Junit单元测试(基于ASpectJ的XML方式)
参考自 https://www.cnblogs.com/ltfxy/p/9882430.html 创建web项目,引入jar包 除了基本的6个Spring开发的jar包外,还要引入aop开发相关的四个 ...
随机推荐
- 基于OpenCV做“三维重建”(2)--封装标定过程
既然已经能够找到了标定点,那么下边的工作就是使用标定结果了.[这本书在这里的内容组织让人莫名其妙]但是通过阅读代码能够很方便地串起来. /*------------------------------ ...
- Python使用LDAP做用户认证
LDAP(Light Directory Access Portocol)是轻量目录访问协议,基于X.500标准,支持TCP/IP. LDAP目录以树状的层次结构来存储数据.每个目录记录都有标识名(D ...
- Spring Boot 数据库连接池 HikariCP
简介 HikariCP 来源于日语,「光」的意思,意味着它很快!可靠的数据源,spring boot2.0 已经将 HikariCP 做为了默认的数据源链接池. 官网详细地说明了HikariCP所做的 ...
- 【codeforces 438D】The Child and Sequence
[原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...
- Request类源码分析
通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...
- SAP 应收票据处理之贴现流程和配置
特殊总账的应收票据处理是通过特殊总账标识实现的,特殊总账标识为W.在配置特殊总账时候,可以通过下面路径,定义特殊总账标识对应的备选科目.
- python-Word模板填充-docxtpl
docxtpl 按指定的word模板填充内容 安装 pip install docxtpl 示例 from docxtpl import DocxTemplate data_dic = { 't1': ...
- webpack的css样式文件加载依赖
1.需要两个依赖包: npm i style-loader css-loader -D
- 记录一下最近的解决的坑爹bug
最近解决的bug长得都很别致啊,记录一下 一 :天气插件引用报403 项目里有一个天气插件引用一直报403 后来确定原因是headers里缺少referer源,无法访问资源的服务器,再后来又发现项目引 ...
- go日常问题记录
1.log.Fatalln()是会强制结束进程.不要用Fatal或Panic开头的 panic是go语言一种错误处理,类似于throw,如果没人catch它,程序就会挂掉,go语言的catch是rec ...