• IOC(DI) —— 注解

    • 注解入门:

      • 在applicationContext.xml中引入context约束

        • 打开spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html中的xsd-configuration.html文件,搜索context schema,找到配置内容复制之,配置内容如下:
<?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" 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">
</beans>
      • 开启扫描组件:扫描配置的包名下的所有子孙包的注解
<!-- 开启扫描组件:扫描配置的包名下的所有子孙包的注解 -->
<context:component-scan base-package="kong.spring.day03.dao"/>
      • 创建UserDao接口
package kong.spring.day03.dao;

public interface UserDao {
public void save();
}
      • 创建UserDao接口的实现类UserDaoImpl
package kong.spring.day03.dao;

import org.springframework.stereotype.Component;

// 使用注解的方式将对象交给Spring管理
// 相当于在xml中配置<bean name="userDao" class="kong.spring.day03.dao.UserDaoImpl"></bean>
@Component(value="userDao")
public class UserDaoImpl implements UserDao{ @Override
public void save() {
System.out.println("我是保存方法。。。save");
}
}
      • 创建测试类
package kong.spring.day03.test;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import kong.spring.day03.dao.UserDao; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo { // 手动装配在UserDaoImpl中使用注解注入的userDao对象
@Resource(name="userDao")
private UserDao userDao; @Test
public void testIocAnnotation01() {
// 测试能否成功调用使用注解注入的userDao对象的save方法
userDao.save();
}
}
      • 测试如果:在UserDaoImpl中使用注解注入的userDao对象能正常使用并调用其save方法

        

    • 使用注解进行属性注入

      • 使用注解Value("属性值")进行注入

        • 可以在类属性上注入
        • 也可以在set方法上注入
      • 使用注解进行属性注入的类代码如下:
package kong.spring.day03.dao;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; // 使用注解的方式将对象交给Spring管理
// 相当于在xml中配置<bean name="userDao" class="kong.spring.day03.dao.UserDaoImpl"></bean>
@Component(value="userDao")
public class UserDaoImpl implements UserDao{ // 没有set方法也能在属性上成功注入,但有set方法时,在属性上注入或set方法注入都可以,并不是“在有SET方法的时注解 @value("值") 必须添加在SET方法上”!
@Value("NulluN_property")
private String name; // 也可以在set方法上注入属性值
//@Value("NulluN_set")
public void setName(String name) {
this.name = name;
} @Override
public void save() {
System.out.println("我是save保存方法;" + "name属性注入值为:" + name);
}
}
      • 测试代码如下:
    // 测试使用注解进行属性注入
@Test
public void testIocDiAnnotation01() {
// 通过调用userDao对象的save方法测试注解注入属性值是否成功
userDao.save();
}
      • 测试结果:

        

    • 根据MVC分层思想,由@Component衍生出来三种在其他类上的注解:

      • @Controller:控制(web)层注解
      • @Service:服务层注解
      • @Repository:数据(持久/dao)层注解
    • 测试在服务层使用@Service注解,同时测试使用@Autowired搭配@Qualifier或@Resource注解进行对象类型注入
      • 创建UserService接口
package kong.spring.day03.service;

public interface UserService {

    public void save();
}
      • 创建UserService接口的实现类UserSeviceImpl
package kong.spring.day03.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import kong.spring.day03.dao.UserDao; //服务层类注解
@Service("userService")
public class UserSeviceImpl implements UserService {

 // 使用@Autowired搭配@Qualifier进行对象类型注入  // 注意:可以只使用@Autowired来自动装配userDao对象;@Qualifier注解不能单独使用,单独使用会报错!

  // 即@Qualifier需要和@Autowired搭配使用
  //@Autowired
  //@Qualifier(value = "userDao")

  // 也可使用@Resource注解进行对象类型注入
  @Resource(name = "userDao")

  private UserDao userDao;

  @Override
public void save() {
userDao.save();
}
}
      • 测试服务层注解是否成功使用
    // 测试使用@Service注解将服务层对象交给Spring管理
@Test
public void testIocServiceAnnotation() {
// 通过调用UserService对象的save方法,进而通过UserDao对象调用其save方法,测试UserDao的注解属性值注入是否成功
us.save();
}
      • 测试结果:服务层注解成功将服务层对象交给Spring管理;同时,服务层使用使用@Autowired搭配@Qualifier注解成功将dao层的userDao对象注入到服务层,从而服务层对象成功调用dao层save方法

        

    • 测试在dao层使用@Repository注解

      • UserDaoImpl代码基本同上,在类上使用@Repository("userDao")注解将userDao对象交给Spring管理
      • 测试代码:
    // 测试dao层使用@Repository注解
@Test
public void testIocRepositoryDiAnnotation() {
// 通过调用userDao对象的save方法测试用@Repository注解是否成功将对象交给Spring管理
UserDao.save();
}
      • 测试结果:成功使用@Repository注解将userDao对象交给Spring管理

        

    • Bean生命周期注解

      • 创建实例后执行方法注解:@PostConstruct

      • 销毁实例前执行方法注解:@PreDestroy

      • 测试代码:
    @Resource(name = "userService")
private UserService us;
// 测试Bean生命周期注解
@Test
public void testBeanLifeCycleAnnotation() {
// 通过打印UserService对象来测试生命周期注解是否成功
System.out.println(us);
}
      • 测试结果:生命周期注解可以正常使用

        

    • @Scope("值")注解,默认为单例,注解在类上

      • 多例注解测试:

        

      • 测试类代码:
    @Resource(name = "userService")
private UserService us;
@Resource(name = "userService")
private UserService us2;
// 测试@Scope多例注解
@Test
public void testScopePrototypeAnnotation() {
System.out.println(us);
System.out.println(us2);
System.out.println(us==us2);
}
      • 测试结果:

        

  • XML与注解

    • 区别:

      • XML:结构清晰,维护方便
      • 注解:开发方便
    • XML与注解结合使用:
      • XML管理Bean
      • 属性注入用注解方式
      • 演示代码中XML配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 开启扫描组件:扫描配置的包名下的所有子孙包的注解 -->
<!--
下面的开启扫描组件配置必须写,如果注释掉会报以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name
'kong.spring.day03.test.TestDemo': Injection of resource dependencies failed; nested
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'userDao' is defined
-->
<!--
由于Bean对象已在XML中配置交给Spring管理,故不用以下扫描配置来扫描相关包下用注解交给Spring管理的对象了!
也就是说可以将类中使用注解交给Spring管理的代码注释掉!
-->
<!-- <context:component-scan base-package="kong.spring.day03.dao"/>
<context:component-scan base-package="kong.spring.day03.service"/> --> <!-- 当不需要使用扫描类,但需要使用注解方式实现属性注入时,用以下配置 -->
<!-- 经测试:以下配置也可以不用!属性一样可以成功使用注解方式注入 -->
<!-- <context:annotation-config/> --> <!-- XML与注解结合 -->
<!-- XML管理Bean -->
<bean name="userDao" class="kong.spring.day03.dao.UserDaoImpl"/>
<bean name="userService" class="kong.spring.day03.service.UserServiceImpl"/>
<bean name="carService" class="kong.spring.day03.service.CarServiceImpl"/>
</beans>
      • UserServiceImpl类代码如下:使用注解实现属性注入
package kong.spring.day03.service;
import javax.annotation.Resource;import kong.spring.day03.dao.UserDao; public class UserServiceImpl implements UserService { @Resource(name = "userDao")
private UserDao userDao; @Resource(name = "carService")
private CarServiceImpl carService; @Override
public void save() {
carService.say();
userDao.save();
}
}
      • UserDaoImpl类代码如下:使用注解实现属性注入
package kong.spring.day03.dao;

import org.springframework.beans.factory.annotation.Value;
public class UserDaoImpl implements UserDao{ @Value("NulluN_property")
private String name; public void setName(String name) {
this.name = name;
} @Override
public void save() {
System.out.println("我是save保存方法;" + "name属性注入值为:" + name);
} }
      • CarServiceImpl类代码如下:
package kong.spring.day03.service;

public class CarServiceImpl {

    public void say() {
System.out.println("我是擎天柱!");
}
}
      • 测试类代码如下:
    // 手动装配在XML中配置的userService对象
@Resource(name = "userService")
private UserService us; // 测试XML与注解结合:Bean在XML中配置,属性依赖注入使用注解在类中实现
@Test
public void testXmlWithAnnotation() {
us.save();
}
      • 测试结果如下:XML与注解结合成功实现Bean交给Spring管理与属性注入

        

  • Spring AOP:

    • AOP:面向切面编程,是OOP的拓展延伸,解决OOP开发中遇到的问题
    • AOP:横向抽取机制(代理机制)取代了OOP纵向继承
    • Spring底层实现AOP原理:动态代理
      • JDK的动态代理
      • Cglib动态代理(第三方代理技术)
      • Spring有自己实现AOP的方式,但被弃用,Spring目前实现AOP使用的是第三方的一个AOP框架,叫“AspectJ”
    • AOP常用相关术语:
      • 连接点(joinpoint):目标对象中,所有可以增强的方法,如下面例子中的CarInfoImpl类中的save方法
      • 切入点(pointcut):目标对象中,已经增强的方法,如下面例子中CarInfoImpl类中的save方法被增强了
      • 通知(advice):增强的代码,如下面例子中CarInfoProxy类中的checkSave方法
      • 目标对象(target):被代理的对象,如下面例子中的CarInfoImpl类的对象
      • 织入(weave):将通知应用到切入点的过程
      • 代理(proxy):将通知织入到目标对象后形成代理对象
      • 切面(aspect):通知+切入点
    • AOP配置:
      • 切面(通知)类和目标类都交给Spring管理
      • 在applicationContext.xml中进行AOP配置前需要加入AOP约束规范,方法类同加入Beans和Context约束规范
      • 下面是applicationContext.xml的配置代码:
    <!-- AOP -->
<!-- 目标类Bean配置 -->
<bean name="carInfo" class="kong.spring.day03.aop.CarInfoImpl"/>
<!-- 通知类配置 -->
<bean name="carInfoProxy" class="kong.spring.day03.aop.CarInfoProxy"/> <!-- AOP配置 -->
<aop:config>
<!-- 配置切入点pointcut:配置需要增强的类中的哪些方法 -->
<aop:pointcut expression="execution(* kong.spring.day03.aop.CarInfo.save(..))" id="carPointcut"/>
<!-- 配置切面 -->
<!-- 配置引用的切面类 -->
<aop:aspect ref="carInfoProxy">
<!-- 在切入点carPointcut中配置前置通知,即执行目标类中方法前要调用以下的切面类中checkSave方法 -->
<aop:before method="checkSave" pointcut-ref="carPointcut"/>
</aop:aspect>
</aop:config>
      • 目标类的接口CarInfo
package kong.spring.day03.aop;

public interface CarInfo {

    public void save();
}
      • 目标类CarInfoImpl
package kong.spring.day03.aop;

/**
* AOP目标类,也可叫“被代理类”,这个类最好是实现接口,而不是直接定义!否则控制台会出现四行很烦人的警告信息!
* @author NulluN
*
*/
public class CarInfoImpl implements CarInfo{ public void save() {
System.out.println("我买了一辆车,我要去浪。。。");
}
}
      • 切面类CarInfoProxy
package kong.spring.day03.aop;

/**
* AOP切面类,也叫“通知类”
* @author NulluN
*
*/
public class CarInfoProxy { public void checkSave() {
System.out.println("我是增强的方法。。。");
}
}
      • 测试代码:
    @Resource(name = "carInfo")
private CarInfo carInfo; // 测试AOP前置通知
@Test
public void testAopBeforeAdvice() {
carInfo.save();
}
      • 测试结果:AOP配置正常,目标类方法被成功增强,且是前置通知类型

        

Spring-Day03-注解注入&AOP入门-作业的更多相关文章

  1. Spring使用注解实现AOP

    一.AspectJ概述 AspectJ是一个面向切面的框架,它扩展了Java语言.定义了AOP语法,能够在编译期提供代码的织入,它提供了一个专门的编译期用来生成遵守字节编码规范的Class文件. @A ...

  2. Spring之注解实现aop(面向切面编程)

    1:Aop(aspect object programming)面向切面编程,名词解释:    1.1:功能:让关注点代码与业务逻辑代码分离    1.2:关注点        重复代码就叫做关注点  ...

  3. spring中注解注入 context:component-scan 的使用说明

    通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描 ...

  4. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

    复制依赖和改jar包方式 src下的都复制过来. 复制到新项目里了 bean.xml里面复制上面一行代码到下面.把aop改成context. 配置spring容器创建时要扫描的包 Service的配置 ...

  5. 模仿Spring实现注解注入

    写这个极其蛋疼,我一直在想我们用SSM写项目时,写Service和Controller的时候,会给Service和Controller私有属性,比如Service需要dao,Controller需要S ...

  6. Spring 注解式Aop 入门

    首先在spring配置文件中加上 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springfr ...

  7. Spring中注解注入bean和配置文件注入bean

    注解的方式确实比手动写xml文件注入要方便快捷很多,省去了很多不必要的时间去写xml文件 按以往要注入bean的时候,需要去配置一个xml,当然也可以直接扫描包体,用xml注入bean有以下方法: & ...

  8. Spring 基于注解的AOP实现

    在本文开始之前,我要引入一张图,这张图的来源 https://blog.csdn.net/chenyao1994/article/details/79708496 ,版权归原作者所有,我借鉴了原作者的 ...

  9. Spring基于注解注入的两种方式

    1.@Autowried 1)默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的). 2)当实现类的Bean大于一个的时候,需结合@Qualifier,根据Bean的名称来指定需 ...

随机推荐

  1. javaEE环境搭建-eclipse

    1.       javaEE环境搭建: (1)     JDK1.8 (2)     eclipse-JavaEE (3)     tomcat-7.0.90 下载地址: https://tomca ...

  2. CRM——讲师与学生

    一.课程记录和学习记录 1.初始化 course_record, study_record.2.学习记录3.录入成绩4.显示成绩 ajax 查询 柱状图展示成绩 highcharts 5.上传作业(o ...

  3. 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...

  4. cocoapods的安装和安装过程中遇到的问题

    查看当前的ruby版本,我的版本是ruby 2.0.0p648 小于2.2安装cocoapods时会遇到以下问题 $ ruby -v 查看当前ruby源,默认为 https://rubygems.or ...

  5. Hyperledger Fabric SDK use case 1

    ///////////////////////////////////////////////////////////////////////:End2endAndBackAgainIT 1.Crea ...

  6. sheepdog

  7. 将CSV文件中的数据导入到SQL Server 数据库中

    导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...

  8. (六)svn 服务器端使用之权限管理

    权限管理(了解) 认证授权机制 在企业开发中会为每位程序员.测试人员等相关人员分配一个账号,用户通过使用svn客户端连接svn服务时需要输入账号和密码,svn服务对账号和密码进行校验,输入正确可以继续 ...

  9. Laravel SMS 短信发送包

    Laravel Sms Laravel 贴合实际需求同时满足多种通道的短信发送组件 我们基于业务需求在 overtrue/easy-sms 基础进行扩展开发,主要实现如下目标: 支持短信验证码直接在 ...

  10. Selenium2学习(十八)-- js处理内嵌div滚动条

    前言 前面有篇专门用js解决了浏览器滚动条的问题,生活总是多姿多彩,有的滚动条就在页面上,这时候又得仰仗js大哥来解决啦. 一.内嵌滚动条 1.下面这张图就是内嵌div带有滚动条的样子,记住它的长相. ...