Spring中的常见注解

实体类相关:

@Data                 //生成set、get、toString、equals、hashCode等方法
@AllArgsConstructor   //生成带参构造方法
@NoArgsConstructor    //生成无参构造方法
@Component            //交由Spring的IOC容器来创建对象
public class Student {
    private Long studentId;
    private String studentName;
    private String studentSex;
    @JSONField(format = "yyyy-MM-dd")      //将pojo对象转json时指定时间类型要转的格式
    //@JSONField(format = "yyyy-MM-dd HH:mm:ss")    
    private Date studentBornDate;
    private String studentImg;
    private StudentClass studentClass;
}
//需要使用lombok依赖
@Data                 
@AllArgsConstructor   
@NoArgsConstructor 
//需要使用fastjson的依赖
@JSONField(format = "yyyy-MM-dd")

Spring 有两大核心:IOC 和 AOP IOC 即控制翻转,通常我们在项目当中需要手动 new 去创建对象,这种方式不利于对对象的管理,现在我们将对象的创建权利翻转给 spring 容器,这就是控制翻转。spring 容器在实例化对象的时候,会根据对象直接的依赖关系,自动完成属性注入工作,这就是依赖注入。 AOP 即面向切面编程,底层是通过动态代理的机制来实现的,支持 jdk 和 cglib 两种。 默认通过 jdk 动态代理。通常我们在项目当中,一些公共功能的实现可以通过 aop 来进行解耦和统一实现,例如:事务管理、日志、权限等。

Spring的IOC容器注解:

交由Spring的IOC容器去创建并管理对象

@Repository  //在Mapper层交由IOC创建EmpMapper对象
public class EmpMapperMySQLImpl implements EmpMapper {
    @Override
    public List<Emp> getAllEmp() {
        System.out.println("mysql的方法");
        return null;
    }
}

@Controller //在控制器层交由IOC容器去创建对象
public class TestController {

}


@Service("empService")  //在Service层交由IOC创建EmpService对象
public class EmpServiceImpl implements EmpService {

    @Autowired                //自动装配属性
    //当存在两个一样的类型时,会先按照名称去找
    //如果名称找不到的话,自动装配就不知道要装配哪个,使用这个注解指定那个
    //这里就是两个实现类,都是EmpMapper的类型的实现类,如果需要使用的话就要指定
    @Qualifier("empMapperMySQLImpl")

    //Resource 默认按照byName自动装配,如果装配失败按照byType装配属性
    private EmpMapper empMapper;   //相当于类的属性
    //@Resource   首先按照byName找,然后按照byType找
    //@Resource(name = "empMapper") 可以找指定名字的,如果找指定名字的,找不到也不会再按照byType找,因为已经指定了按照名字找
    @Resource(name = "empOracle")
    private EmpMapper empMapper2;

    @Override
    public List<Emp> getAllEmp() {
        empMapper2.getAllEmp();
        return empMapper.getAllEmp();
    }
}


//默认的名字是类名,首字母改成小写
//可以修改名字,直接在注解里面写括号,双引号里面直接写新的名字即可
//写完注解不可以直接使用的,需要写配置文件 让springIOC容器去扫描指定的位置(扫描到带注解的类就可以使用了),才可以
// <context:component-scan base-package="com.lcz"/>
@Component("emmp")    //除了Service层、Mapper层、Controller层其他层需要IOC去管理对象的话使用这个注解  
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    @Value("123")    //可以使用Value这个注解直接给属性赋值
    private Integer empId;
    private String empName;
    private String gender;
    @Autowired      //这里的自动装配是根据类型而不是根据名字装配,而且装配是优先选择注解(同类型,有注解,有xml配置,选择注解)
    private Dept dept;
}

四个注解,分别管理不同层的对象:(需要添加Spring的依赖)

@Controller  //Controller层
@Repository  //Mapper层
@Service   //Service层
@Component  //除以上之外的层

AOP的注解:

package com.licz.annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component  //这个对象交由Spring的IOC容器去创建
@Aspect   //方法增强注解,除此之外还需要添加配置:(配置如下)
public class EmpServiceAspectj {
    //可以定义一个公共的,定义一处,多处使用
    @Pointcut("execution( * com.licz.annotation.EmpService.addEmp(com.licz.aop.Emp))")
    //增强的方法:public void addEmp(Emp emp) {
    public void pointCut() {

    }

    //使用的时候调方法名即可
    @Before("pointCut()")
    public void beforeHandle(JoinPoint joinPoint) {
        System.out.println("方法名" + joinPoint.getSignature().getName());
        System.out.println("目标对象" + joinPoint.getTarget());
        System.out.println("方法参数" + Arrays.toString(joinPoint.getArgs()));
        System.out.println("打开连接");
    }

    //无论是否出现异常,都会执行
    @After("execution( * com.licz.annotation.EmpService.addEmp(com.licz.aop.Emp))")
    public void afterHandle() {
        System.out.println("目标方法之后执行的方法");
    }

    @AfterReturning("execution( * com.licz.annotation.EmpService.addEmp(com.licz.aop.Emp))")
    public void returnningHandle() {
        System.out.println("目标方法执行成功之后执行此处。。。。");
    }

    @AfterThrowing(value = "execution( * com.licz.annotation.EmpService.addEmp(com.licz.aop.Emp))", throwing = "ex")
    public void exceptionHandle(Exception ex) {
        System.out.println("目标方法执行异常后执行这里,异常日志:" + ex);
    }

    //环绕增强:前面所有的注解功能,这里都可以实现
    @Around(value = "execution( * com.licz.annotation.EmpService.addEmp(com.licz.aop.Emp))")
    public Object aroundHandle(ProceedingJoinPoint proceedingJoinPoint) {
        //注意:方法增强是在原方法不变的基础上,对功能进行增强,如果有一个功能:
        //登录功能:原方法,登录查询,返回一个pojo类型,不为null登录成功,null登录失败
        //如果这里做增强,返回值为boolean类型,在目标方法后的增强,那么原方法的返回值就会由pojo改为boolean,
        //因为是目标方法执行完之后执行增强方法,返回值类型就会以后执行的为准
        try {
            System.out.println("之前会执行的方法");
            // 执行目标方法
            Object proceed = proceedingJoinPoint.proceed();
            System.out.println("之后会执行的方法");
            return proceed;
        } catch (Throwable e) {
            System.out.println("目标方法异常执行这里:异常:" + e);
        } finally {
            // 一定会执行的方法
            System.out.println("关闭连接");
        }
        return null;
    }
}

配置:application-context.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
   <!--使用注解创建对象的话要开启组件扫描-->
    <context:component-scan base-package="com.licz.annotation"/>
    <!--
    对象是由Spring的IOC容器创建的,而这个增强功能是aspectj提供的
    让spring认识aspectj
    -->
    <aop:aspectj-autoproxy/>
</beans>

事务:

使用注解:

package com.lcz.service.impl;

import com.lcz.mapper.AccountMapper;
import com.lcz.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service  //注解的方式   创建IOC容器中的accountService对象
public class AccountServiceImpl implements AccountService {
    @Autowired    //自动装配对象,装配到IOC容器中,是根据byType识别的对象
    private AccountMapper accountMapper;

    @Override
    @Transactional  //事务:如果全部SQL中有SQL执行异常,自动回滚,如果全部执行成功,则提交
    public void updateAccountMoney(Integer outAccountId, Integer inAccountId, Double money) {
        accountMapper.updateAccount(outAccountId, -money);
        int a = 10 / 0; //此处有异常,事务会进行回滚
        accountMapper.updateAccount(inAccountId, money);
    }
}

配置:application-context.xml

     <!--配置事务管理器-->
     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
     </bean>
     <!--开启事务注解   这是使用注解的方式 注解是在Service的实现类的对应方法上加上@Transactional-->
     <tx:annotation-driven transaction-manager="transactionManager"/>

使用配置文件:推荐使用

以配置的方式实现事务,可以配置完之后无需额外的注解,一处配置,全部使用

    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--以配置的方式实现事务,可以配置完之后无需额外的注解,一处配置,全部使用-->
    <!--配置事务的属性-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--匹配的是Service层的方法名,这里就是以add开头的方法,当有异常时就回滚-->
            <tx:method name="add*" rollback-for="Exception"/>
            <tx:method name="remove*" rollback-for="Exception"/>
            <tx:method name="modify*" rollback-for="Exception"/>
            <tx:method name="find*" read-only="true"/>
            <!--Service层的所有方法,有异常时就回滚,可能有一些方法名前缀不是add、remove、等的-->
            <tx:method name="*" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>
    <!--配置aop增强,用到增强的话就需要加入spring-aspects的依赖-->
    <aop:config>
        <!--配置增强的切点,* com.lcz.service.impl.*.*(..)  指的是所有修饰符返回值下的impl包下的所有类的所有方法,不管什么参数(可变参数)-->
        <aop:pointcut id="pointCut" expression="execution(* com.lcz.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
    </aop:config>

Maven中的依赖缺一不可,否则项目会启动报错

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Spring Boot常见注解有: 1. @SpringBootApplication:用于标记主类,表示该类是Spring Boot应用的入口类。该注解主要包含了@ComponentScan、@EnableAutoConfiguration和 @Configuration三个注解。 2. @RestController:用于标记Controller类,表示该类是Spring MVC的控制器,并且会自动将返回的数据转换为JSON格式。 3. @RequestMapping:用于映射请求URL和Controller方法之间的关系,可以用在类级别和方法级别。在类级别上使用时,会为该类的所有方法的URL添加一个前缀。 4. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:这些注解分别用于标记GET、POST、PUT、DELETE请求的处理方法。它们与@RequestMapping的作用类似,用于指定请求的URL和HTTP方法。 5. @RequestParam:用于从请求参数获取值,将请求参数与方法参数进行绑定。 6. @PathVariable:用于从URL路径获取值,将路径变量与方法参数进行绑定。 7. @RequestBody:用于将请求体的内容绑定到方法参数上,常用于接收JSON格式的请求数据。 8. @ResponseBody:用于将方法返回的对象转换为HTTP响应体,并将其发送给客户端。 9. @Autowired:用于自动注入依赖对象,Spring Boot会自动扫描并创建相应的对象,并将它们注入到标记了@Autowired的属性上。 10. @Configuration:用于标记配置类,指示Spring Boot需要对该类进行额外配置。 以上只是一些常见注解Spring Boot还有许多其他的注解供开发者使用,用于不同的场景和功能需求。 ### 回答2: Spring Boot是一个Java框架,提供了很多常见注解来简化开发。以下是一些常见Spring Boot注解: 1. @SpringBootApplication:这是一个组合注解,用于标注主类。它包含了@EnableAutoConfiguration、@ComponentScan和@Configuration注解,用于自动配置、扫描组件和声明配置文件。 2. @RestController:该注解用于标注一个类,表示这是一个RESTful风格的控制器,用于处理HTTP请求和返回响应。 3. @RequestMapping:用于将请求映射到处理方法或控制器类上。 4. @Autowired:用于自动装配Bean,通过依赖注入来实现组件的自动装配。 5. @Component:用于将类标记为一个Spring组件,通过自动扫描和注册,将其作为Bean管理。 6. @Configuration:标识该类是一个配置类,用于声明Spring的配置信息。 7. @Value:用于注入属性值,从配置文件读取。 8. @PathVariable:用于获取URL的路径参数。 9. @RequestParam:用于获取HTTP请求的请求参数。 10. @ResponseBody:用于将方法的返回值直接作为HTTP响应体返回。 11. @ExceptionHandler:用于捕获处理方法抛出的异常,并进行统一处理。 12. @Transactional:用于标记一个方法或类需要进行事务管理。 13. @Service:用于标记一个类为服务层的组件。 14. @Repository:用于标记一个类为数据访问层的组件。 15. @Aspect:用于声明一个切面,定义横切关注点和通知类型。 以上只是常见的一些Spring Boot注解,还有其他更多的注解用于实现不同的功能和特性。 ### 回答3: Spring Boot常见注解包括: 1. @SpringBootApplication:用于标记主类,表示这是一个Spring Boot应用程序的入口点。它是由三个注解组成的组合注解:@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。 2. @RestController:用于标记一个类,表示该类是一个RESTful风格的控制器。它将类的方法的返回值直接作为响应内容,而不是返回视图。 3. @RequestMapping:用于映射HTTP请求的URL路径到方法上。可以用在类和方法上,用于指定处理请求的路径。 4. @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:这些注解分别用于映射HTTP的GET、POST、PUT、DELETE请求到方法上,可以指定路径,并且支持Ant风格的路径匹配。 5. @PathVariable:用于将URL路径的参数绑定到方法的参数上。通常与@RequestMapping一起使用,用于处理带有路径参数的请求。 6. @RequestParam:用于从请求的URL、查询参数或者表单参数获取参数的值,并绑定到方法的参数上。 7. @RequestBody:用于接收HTTP请求的请求体,并绑定到方法的参数上。通常用于处理POST请求的JSON/XML数据。 8. @ResponseBody:用于将方法的返回值直接作为响应内容返回给客户端。通常用于处理RESTful风格的API请求。 9. @Autowired:用于自动装配依赖的Bean。它可以注入Spring容器的Bean,减少手动配置依赖的繁琐操作。 10. @ConfigurationProperties:用于将配置文件的属性值绑定到Spring Boot应用程序的配置类。 以上是Spring Boot常见注解,这些注解可以帮助我们更方便地开发和配置Spring Boot应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值