7-30Spring-day1

本文深入解析Spring框架的关键概念,包括依赖注入的各种方式、XML自动注入、全注解配置、AOP面向切面编程及代理模式的实现,提供丰富的实例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.课程介绍
1. 依赖注入;(掌握)
2. XML自动注入;(了解)
3. 全注解配置;(掌握)
4. 代理模式;(掌握,超难)
5. AOP;(掌握)
6. Bean的创建方式(掌握)

一,依赖注入

什么是依赖注入
一个类里面依赖于另一个类,然后spring把类的对象创建出来,然后注入到相应的类里面去

依赖注入的方式:
set方法注入
构造器方法注入
注解式方法注入

!-- 构造器注入 index索引注入方式-->
        <!--<constructor-arg index="0" value="5"></constructor-arg>
        <constructor-arg index="1" value="小王"></constructor-arg>-->
        <!-- 构造器注入 通过name注入-->
        <!-- <constructor-arg name="id" value="1"></constructor-arg>
         <constructor-arg name="name" value="老王"></constructor-arg>-->
        <!--构造器注入 通过type类型注入-->
        <!--
         <constructor-arg type="java.lang.Long" value="1"></constructor-arg>
         <constructor-arg type="java.lang.Long" value="18"></constructor-arg>
         <constructor-arg type="java.lang.String" value="剑锋"></constructor-arg>-->

        <!--类里面有一个属性是对象 怎么注入 -->
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="yyy"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <!-- <constructor-arg name="hb" ref="hb"></constructor-arg>-->
        <constructor-arg name="hb">
            <bean class="cn.itsource._01_di.HelloBean"></bean>
        </constructor-arg>

数组两种方式
简写:

 <!--<property name="arrays" value="1,2,3"></property>-->

完整写法:

<property name="arrays">
            <array>
                <value>币</value>
                <value>钱</value>
                <value>命</value>
            </array>
        </property>

二,XML自动注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="byType">
    <bean id="userDao" class="cn.itsource._02_xmlauto.UserDao"></bean>
    <bean id="userService" class="cn.itsource._02_xmlauto.UserService"></bean>
    <bean id="userServicex" class="cn.itsource._02_xmlauto.UserService"></bean>
    <bean id="userController" class="cn.itsource._02_xmlauto.UserController" autowire="byName">
    </bean>
</beans>

三,全注解配置
配置让Spring扫描类与支持注解

<!-- 开启扫描 controller service repository component-->
    <context:component-scan base-package="cn.itsource._03_anno"/>

配置dao层进行注解

Repository("jpaDao")
public class UserJpaDao implements IUserDao{

    public void save() {
        System.out.println("jpa保存数据");
    }
}

配置service层进行注解

@Service
public class UserService implements IUserService {
    @Resource(name = "jpaDao")
    private IUserDao userDao;
    public void save() {
        userDao.save();
    }
}

配置controller层进行注解

@Controller
@Scope("prototype")
public class UserController {
    @Autowired
    private IUserService userService;
    public void save(){userService.save();}
}

四,AOP面向切面
AOP
它是spring一个特性,面向切面的编程
什么叫面向切面的编程:
它的产生并不是取代面型对象,而是扩展,把类切开(切到方法上面)
可以往方法前后添加一些逻辑
什么叫面向对象编程
万事万物皆对象,使用对象思维操作编程。
Aop使用场景:
事务管理
日志管理
性能监控
拦截器
Aop实现
底层是通过代理模式实现–代理模式jdk/cglib动态代理

public class TxManager {
    public void begin(){
        System.out.println("事物开启");
    }
    public void commit(){
        System.out.println("事物提交");
    }
    public void rollback(Throwable e){
        System.out.println("事物回滚"+e.getMessage());
    }
    public void close(){
        System.out.println("事物关闭");
    }


    //环绕通知
    @Around("pointcu()")
    public void around(ProceedingJoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();
        try {

            if("find".equals(methodName) || "query".equals(methodName)){
                //去执行方法 save
                joinPoint.proceed();
            }else {
                //事物开启
                begin();
                System.out.println(joinPoint.getSignature().getName());
                //去执行方法 save
                joinPoint.proceed();
                //事物提交
                commit();
            }
        } catch (Throwable e) {
            e.printStackTrace();
            //报错就回滚
            rollback(e);
        }finally {
            if("find".equals(methodName) || "query".equals(methodName)) {

            }else{
                close();
            }
        }
    }

五,代理模式
了解能理解多深就多深
代理模式
静态代理:如果对多个接口或者多个方法,写很多额外的代理实现
动态代理
实现了解
动态代理 jdk(有接口) cglib(没有接口代理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值