2020-12-28

Spring
------>实现步骤:
1.创建 maven 项目
2.加入 maven 依赖
3.创建类(接口和它的实现类)
和没有使用框架一样,就是普通类
4.创建 Spring 需要需要使用的配置文件
声明类的配置信息,这些类由 Spring 创建和管理
5.测试 Spring 创建的对象

//1.指定 Spring 配置文件
String config="beans.xml";
//2.创建 Spring 容器对象,ApplicationContext
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
//3.从容器中获取对象
SomeService service= (SomeService) ac.getBean("SomeService");

一、IOC控制反转
DI:依赖注入,表示创建对象,给属性赋值
简单类型:spring 规定 Java 基本数据类型、包装类型、String 为简单 类型

1.基于 xml 的DI

        <bean name="类id" class="类位置">
            <!--set注入-->
            <property name="属性名" value=“此属性值”>   <!--简单类型-->
            <property name="属性名" ref="引用id">      <!--引用类型-->
        </bean>

1)引用类型属性自动注入

    a.byName:根据名称自动注入--->引用类型属性名和spring容器中<bean>的id一样,且数据类型一致

        <bean name="类id" class="类位置" autowire="byName">
        <!--set注入-->
            <property name="属性名" value=“此属性值”>   <!--简单类型-->
           // <property name="属性名" ref="引用id">      <!--引用类型-->
        </bean>

    b.byType:按类型注入---->引用类型的数据类型和spring容器中<bean>的class属性是同源关系
                同源关系——相等、继承关系、是接口和实现类关系
                byName换成byType

                注意:在byType中,在xml配置文件中声明bean只能由一个符合条件,多余一个是错误的

2)为应用指定多个 Spring 配置文件
    作用:每个文件小,效率高。避免多人开发出现并发问题。
    一个模块一个配置文件

2.基于注解的DI

1.@Component
2.@Respotory
3.@Service
4@.Controller
5.@Value
6.@Autowired
7.@Resource

-------> 步骤:
1.创建类,在类中加入注解
2.创建 spring 的配置文件
声明组件扫描器的标签,指名注解在你项目中的位置

扫描包:
<context:component-scan base-package=""> //包名

<!- 可以使用分隔符(;or,)分隔多个包名 ->

 3.使用注解创建对象,创建 ApplicationContext 对象

一、@Component(value="nameId")
    创建对象,等同于 <bean> 标签,value 就是对象名称,即:bean 的 id



与 @Component 具有相同功能:

   @Repository  持久层--->dao 实现类
   @Service     业务层--->service 实现类
   @Controller  控制器--->控制器实现类


二、赋值
@Value 给基本类型赋值,标注在属性名(推荐)/set方法上
    @Value("")

@Autowired 引用类型的赋值,默认是 byType
    要使用 byName 方式,在加一个@Qualifier(value="bean的id")

    属性:required=true:赋值失败,报错并终止执行 (默认)
         required=false:赋值失败,不报错,赋值为 null

@Resource 来自于 JDK 注解,跟 @Autowired 相同。
    先使用 byName,失败再使用 byType

    属性:name="bean的Id",只使用 byName

二、AOP 面向切面编程

1.动态代理:
JDK 动态代理,使用 jdk 中的 Proxy、Method、 InvcaitonHander创建代理对象
*要求目标类必须实现接口
cglib 动态代理,第三方工具库,创建代理对象,原理是继承。
要求目标类不能是 final,方法也不能是 final
作用:不改变源代码增加功能,实现解耦合。

理解:
1.分析项目功能,找出切面
2.确定切面的执行位置(哪个类/方法)切入点
3.安排切面执行时间(目标方法前/后)通知
2.aspectJ框架:(底层——JDK动态代理)
1.切面执行时间(Advice)

	    @Before(value="切入点表达式")
            通知方法可以无参数

        @AfterReturning(value="切入点表达式" ,returning="res")
            returning 自定义变量,表示目标方法返回值
                        变量名必须跟通知方法形参名一致

            通知方法参数:Object res,用来获取切入点返回值

        不能改变代理方法的值(通过引用改变不算)

        @Around(value="切入点表达式")
            通知方法参数:ProceedingJoinPoint pjp,用来代理切入点方法
                pjp.proceed();
                因为ProceedingJoinPoint继承自JoinPoint,故ProceedingJoinPoint也可以用来获取切入点方法参数
            可以改变代理方法的值!

        @AfterThrowing
        @After

    2.切面执行位置——切入点表达式

    3.创建切面类,@Aspect

    4.配置文件声明自动代理
        <aop:aspectj-autoproxy />
------>步骤:
        1.加入依赖
            Spring-aspects
        2.创建目标类
        3.创建切面类
            a.类上加@Aspect
            b.方法上加通知注解 例如:@Before("切点表达式execution()")
        4.创建 Spring 配置文件:
            a.声明切面对象
            b.生成 aspectJ 框架的自动代理器生成标签
        5.使用:从容器中取得时候要用目标类的接口来获取目标对象,再调用相关方法(有接口,用的JDK动态代理)
                没接口时,直接使用相关类获取接口对象(没借口,用的cglib动态代理)

    3.参数
        1.JoinPoint jp,可以在通知方法中获取切入点方法执行时的信息,如方法名、方法的实参
            必须放在所有参数的第一位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值