初识 Spring

一、什么是Spring框架

  • 是一个轻量级的企业级应用框架
  • 企业应用开发的"一站式"选择,贯穿于表现层、业务层、持久层

二、Spring框架的优点

  • 低侵入式设计
  • 独立于各种应用服务器
  • 依赖注入特性将组件关系透明化,降低耦合度
  • 面向切面编程特性允许将通用任务进行集中式处理
  • 与第三方框架的良好整合

三、Spring体系结构

四、Spring设计理念

是面向Bean的编程

五、Spring两大核心技术

  1. 控制反转(IoC:Inversion of Control) / 依赖注入(DI:Dependency Injection)
  2. 面向切面编程(AOP:Aspect Oriented Programming)

六、 什么是控制反转和依赖注入

控制反转(IOC):创建对象的控制权转移,是一种程序设计思想
依赖注入(DI):将依赖的对象注入到需要的类中去,是“控制反转”设计思想的具体实现方式

七、如何使用控制反转和依赖注入

可以通过四种实现方法:①get,set注入 ②构造函数注入 ③注解 ④p命名空间注入

①get,set注入

<bean id="users" class="domain.Users">
        <property name="id" value="1001"></property>
        <property name="name" value="星星"></property>
</bean>
 
public void textUsers(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        Users users= (Users) context.getBean("users");
        System.out.println(users.toString());
 }

②构造函数注入

Mapper中的:
public interface SmsUserMapper {
    /**
     * 新增注入
     * @return
     */
    int insert();
}
 
public class SmsUserMapperImpl implements SmsUserMapper {
    /**
     * 新增注入
     *
     * @return
     */
    @Override
    public int insert() {
        System.out.println("执行了新增方法......");
        return 0;
    }
}
 
Service中的:
public interface UserService {
    /**
     * 新增注入
     * @return
     */
    int insert();
}
 
public class UserServiceImpl implements UserService{
    public SmsUserMapper smsUserMapper;
    public UserServiceImpl(SmsUserMapper smsUserMapper) {
        this.smsUserMapper = smsUserMapper;
    }
 
    /**
     * 新增注入
     *
     * @return
     */
    @Override
    public int insert() {
        System.out.println("执行了新增方法......");
        return 0;
    }
}
 
<!--构造注入-->
    <bean id="userMapper" class="mapper.SmsUserMapperImpl"></bean>
    <bean id="userService" class="service.UserServiceImpl">
        <constructor-arg ref="userMapper"></constructor-arg>
    </bean>
 
测试类:
public void testService(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService=(UserService) context.getBean("userService");
        userService.insert();
    }

③注解

1.先在Mapper实现类中加上注解,这个注解相当于<bean id="userMapper" class="mapper.SmsUserMapperImpl"></bean>

 

Spring提供了多个注解,用于实现依赖注入、控制反转和其他常见的功能。以下是一些常用的Spring注解: 

  1. @Component:用于将类标记为组件,表示该类是一个由Spring管理的组件。可以与@Autowired一起使用,实现依赖注入。

  2. @Controller:用于标记控制器类,处理请求并返回响应。

  3. @Service:用于标记服务类,表示该类提供业务逻辑的服务。

  4. @Repository:用于标记数据访问层(DAO)类,表示该类用于访问数据库或其他持久化机制。

 ④p命名空间注入 

1.先添加p命名空间的声明:xmlns:p="http://www.springframework.org/schema/p"

<bean id="users" class="domain.Users" p:name="张三" p:id="23"></bean>

 八、编写第一个Spring程序

1.先导入jar包的坐标

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2.写一个HelloSpring类

public class HelloSpring {
    //定义hello属性,该属性的值将通过Spring框架进行设置
    private String hello=null;
 
    /**
     * 输出方法,从Spring配置文件中获取属性并输出
     */
    public void print(){
        System.out.println("Spring say:,"+this.getHello()+"!");
    }
    public String getHello(){
            return hello;
    }
    public void setHello(String hello){
        this.hello=hello;
    }
}

3.编写Spring配置文件

  

 

  新建好后这就是配置文件中的关键配置信息

 

 然后我们开始在配置文件中开始写

    <bean id="helloSpring" class="domain.HelloSpring">
        <!--property元素用来为实例的属性赋值,此处调用setHello()方法实现赋值操作-->
        <property name="hello">
            <!--此处将字符串赋值给hello属性-->
            <value>反转的人生,如此惊艳</value>
        </property>
    </bean>

写好后我们就可以编写测试类了

面向切面编程(AOP)

1.简介

AOP

AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合式降低,提高程序的可重用性,同时提高了开发的效率。

AOP原理

  • 将复杂的需求分解出不同方面,将不同对象、不同模块之间的共同业务集中解决
  • 通过动态代理的方式,把抽离出来的共性代码"织入"到业务代码中,实现对原有代码的增强处理

  

 切入点表达式常用的模糊查询


①public * addNewUser(entity.User):"*"表示匹配所有类型的返回值

②public void *(entity.User):"*"表示匹配所有方法名

③public void addNewUser(..):".."表示匹配任意参数个数和类型

④*com.service.*.*(..):匹配com.service包下所有类的所有方法

⑤*com.service..*.*(..):匹配com.service包及其子包下所有类的所有方法
 

  AOP相关术语

  

AOP中常见的增强处理类型及其特点:

  1. 前置增强(Before advice):在目标方法执行之前执行的增强处理。可以用于执行一些准备工作或进行参数验证等操作。

  2. 后置增强(After returning advice):在目标方法成功执行之后执行的增强处理。可以用于执行一些清理工作或获取返回结果等操作。

  3. 异常增强(After throwing advice):在目标方法抛出异常时执行的增强处理。可以用于进行异常处理或记录日志等操作。

  4. 最终增强(After finally advice):无论目标方法是否正常返回或抛出异常,最终增强都会执行。可以用于释放资源或进行一些必要的收尾工作。

  5. 环绕增强(Around advice):在目标方法前后都执行的增强处理。可以完全控制目标方法的执行过程,包括是否执行目标方法、修改传入参数、捕获返回结果等操作。

 使用Spring AOP实现日志输出

1.先导入这五个jar包的坐标

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>1.9.5</version>
</dependency>
 
<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>
 
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.0</version>
</dependency>
 
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

2.编写切面

  在切面里面写上这5个通知

@Before("execution(* service..*.*(..))")
    public void before(){
        //在方法之前要执行的公共代码放在这里
        System.out.println("前置通知.....");
    }
 
    /**
     * 后置通知
     * @param returnVal,切点方法执行后的返回值
     */
    @AfterReturning(value = "execution(* service..*.*(..))",returning = "returnVal")
    public void AfterReturning(Object returnVal){
        System.out.println("后置通知......"+returnVal);
    }
 
    /**
     * 环绕通知
     * @param joinPoint 可用于执行切点的类
     * @return
     * @throws Throwable
     */
    @Around("execution(* service..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint)throws Throwable{
        System.out.println("环绕通知前.....");
        Object obj=(Object) joinPoint.proceed();
        System.out.println("环绕通知后......");
        return obj;
    }
 
    /**
     * 抛出异常
     * @param e
     */
    @AfterThrowing(value = "execution(* service..*.*(..))",throwing = "e")
    public void afterThrowable(Throwable e){
        System.out.println("出现异常:msg="+e.getMessage());
    }
 
    /**
     * 无论什么情况下都会执行的方法
     */
    @After(value = "execution(* service..*.*(..))")
    public void after(){
        //方法的对象的关闭
        //方法的回滚
        System.out.println("最终通知....");
    }

然后在配置文件里去依赖注入

    <bean id="myAspest" class="aspect.MyAspect"></bean>
        <!--开启注解-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

总结

  

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值