注解-spring

@Configuration 标识当前类是配置类
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

@Configuration不可以是final类型;
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。

@ComponentScan 包扫描注解 扫描注解
@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中

@Bean 标识该方法的返回值交给Spring容器管理
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。
(和xml配置中的bean标签的作用是一样的)

@Scope 控制多例和单例
@Scope注解的详细用法
默认是单例模式,即scope="singleton"。另外scope还有prototype、request、session、global session作用域。scope="prototype"多例
@scope默认是单例模式(singleton)

@Lazy 懒加载
@Lazy用于指定该Bean是否取消预初始化。主要用于修饰Spring Bean类,用于指定该Bean的预初始化行为,
使用该Annotation时可以指定一个boolean型的value属性,该属性决定是否要预初始化该Bean
lazy代表延时加载,lazy=false,代表不延时,如果对象A中还有对象B的引用,会在A的xml映射文件中配置b的对象引用,多对一或一对多,不延时代表查询出对象A的时候,会把B对象也查询出来放到A对象的引用中,A对象中的B对象是有值的。
lazy=true代表延时,查询A对象时,不会把B对象也查询出来,只会在用到A对象中B对象时才会去查询,默认好像是false,你可以看看后台的sql语句的变化就明白了,一般需要优化效率的时候会用到


@PostConstruct 初始化方法
pring注解@PostConstruct
该注解可以实现在运行工程时,自动运行该注解下的方法;
@PostConstruct是java5的时候引入的注解,指的是在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如数据字典之类的。
 被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行

@PreDestroy 销毁方法
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

@Component 将当前类未来的对象交给容器管理
@Component: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。

@Autowired 按照类型进行注入
@Autowired默认按照byType自动注入
@Autowired采取的是按照类型进行自动注入的,Autowired源码中只有一个属性required(稍后介绍)。
说明@Autowired无法人为去干预注入规则的,然后当容器中同一类型的bean存在多个的话,@Autowired该如何去选择呢,这时就需要@Qualifier注解来帮忙了。

@Qualifier 按照名称进行注入
Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。

@Repository 标识持久层注解
Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。
1. Repository模式是架构模式,在设计架构时,才有参考价值;
2. Repository模式主要是封装数据查询和存储逻辑;
3. Repository模式实际用途:更换、升级ORM引擎,不影响业务逻辑;
4. Repository模式能提高测试效率,单元测试时,用Mock对象代替实际的数据库存取,可以成倍地提高测试用例运行速度。
评估:应用Repository模式所带来的好处,远高于实现这个模式所增加的代码。只要项目分层,都应当使用这个模式。
关于泛型Repository接口(来源):
仅使用泛型Repository接口并不太合适,因为Repository接口是提供给Domain层的操作契约,不同的entity对于Domain来说可能有不同的操作约束。因此Repository接口还是应该单独针对每个Eneity类来定义。
泛型的Repository<T>类仍然用来减少重复代码,只是不能被UserRepository类直接继承,因为这样Delete方法将侵入User类,所以改为在UserRepository中 组合一个Repository<T>,将开放给domain可见且又能使用泛型重用的功能委托给这个Repository<T>

@Service 标识Service层
 @Service("serviceName")注解相当于applicationContext.xml配置文件中配置的<bean id="serviceName">,表示给当前类命名一个别名,方便注入到其他需要用到的类中。@Service注解也可以不指定serviceName,如果不指定相当于<bean id="com.study.service.serviceName">,com.study.service.ServiceName就是这个类的全限定名,不加的话,默认别名就是当前类名,但是首字母小写。


@Controller 标识Controller层
org.springframework.stereotype.Controller 注解类型用于指示sping 类的实例是一个控制器。
@Controller 用于标记一个类,使他标记的类就是一个SpingMVC Controller 对象,即是一个控制器。Sping使用扫描机制查找程序中所有基于注解的控制器类。分发处理器会扫描使用注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping 注解的方法才是正真处理请求的处理器。


@Value 为属性赋值 @Value("${key}")
1 @Value注解作用
读取配置文件中的属性。

@Value的值有以下两类:
${ property : default_value } 
#{ obj.property? :default_value } 

$注入的是外部配置文件对应的property,使用“:”对未配置或值为空的属性设置默认值。

#注入的是SpEL表达式对应的内容,使用“?:”对未配置或值为空的表达式设置默认值。

default_value为默认值。

2 举例
apollo.meta = xxxx  字符串

apollo.namespace = xxx,xxx,xxx  数组

channelIdToName = {1: "全画作", 2: "全古籍", 3: "全音乐"}  map

基于配置文件注入

复制代码
/**
 * 注入简单字符串
 */
@Value("${apollo.meta:xxx}")  读取字符串配置项,配置为空时取默认值xxx。
String meta;

/**
 * 注入数组,默认','分隔
 */
@Value("${apollo.namespace}")  读取逗号分隔的字符串
String[] array;

/**
 * 注入列表,默认','分隔
 */
@Value("${apollo.namespace}")  读取逗号分隔的字符串
List<String> list;

/**
 * 注入map,#和$并用,#要在$前面
 */
@Value("#{${channelIdToName}}")  读取配置文件中的map,直接赋值给已定义好的map类型。
Map<Integer,String> map;

基于非配置文件注入

复制代码
/**
 * 注入普通字符串,相当于直接给属性默认值
 */
@Value("项目名")
private String projectName;


/**
 * 注入操作系统属性
 */
@Value("#{systemProperties['os.name']}")
private String systemPropertiesName;


/**
 * 注入其他Bean属性:注入article对象的属性title
 */
@Value("#{article.title}")
private String articleTitle;


/**
 * 注入列表,设置根据"|"来分隔
 */
@Value("#{'${words}'.split('\\|')}")
private List<String> numList;


/**
 * 注入文件资源
 */
@Value("classpath:config.xml")
private Resource config;


@PropertySource 加载指定路径的配置文件properties
@PropertySource是Spring boot为了方便引入properties配置文件提供的一个注解,可以标注在SpringBoot的启动类上,还可以标注在配置类(使用@Configuration标注的类)上。

例如:@PropertySource(value = {"classpath:box.properties"}),将classpath下的box.properties,注入到Spring环境中,使用@Value("${key}")取值。

示例:

box.properties文件:

# 工具箱配置
 
preserveFilePath=/box/webserver/uploadfile/preservefile/
注入:

@SpringBootApplication
@PropertySource(value = {"classpath:box.properties"})
public class ToolboxApiApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ToolboxApiApplication.class, args);
    }
 
}
取值: 

@RestController
public class DeleteFileController {
    @Value("${preserveFilePath}")
    private String preserveFilePath;
 
    @GetMapping("/deleteFile")
    public void test(){
        System.out.println(preserveFilePath);
    }
}


@Aspect 标识当前类是一个切面类
@Aspect:作用是把当前类标识为一个切面供容器读取


@Pointcut 用于定义切入点表达式 表达式写法4种
Pointcut(切入点): JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。

@EnableAspectJAutoProxy 让AOP的注解有效果
在配置类上添加@EnableAspectJAutoProxy注解,能够开启注解版的AOP功能。也就是说,AOP中如果要使注解版的AOP功能起作用,就需要在配置类上添加@EnableAspectJAutoProxy注解。

@Before AOP-前置通知

@AfterReturning AOP-后置通知

@AfterThrowing AOP-异常通知

@After AOP-最终通知

@Around AOP-环绕通知

@Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
@Order注解主要用来控制配置类的加载顺序
示例代码:

package com.runlion.tms.admin.constant;
 
public class AService {
 
}
package com.runlion.tms.admin.constant;
 
public class BService {
 
package com.runlion.tms.admin.constant;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
 
@Configuration
@Order(2)
public class AConfig {
  @Bean
  public AService AService() {
    System.out.println("AService 加载了");
    return new AService();
  }
 
}
package com.runlion.tms.admin.constant;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
 
@Configuration
@Order(1)
public class BConfig {
  @Bean
  public BService bService() {
    System.out.println("BService 加载了");
    return new BService();
  }
}
测试类:

package com.runlion.tms.admin.constant;
 
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class OrderMain {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext context =
        new AnnotationConfigApplicationContext("com.runlion.tms.admin.constant");
  }
}
输出结果:
BService 加载了
AService 加载了

@ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
@responseBody注解的使用
1、

  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

2、  

  @RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

  效果等同于如下代码:
  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

@RequestMapping("/hello") 实现浏览器的请求路径与方法的映射
@RequestMapping 注解可以在控制器类的级别和/或其中的方法的级别上使用。

@PathVariable restFul结构,接收参数的注解.
@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值
语法:

@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) 
 
@RequestMapping(value=”user/{id}/{name}”)
请求路径:http://localhost:8080/hello/show5/1/james


@GetMapping("") 只能接收GET请求类型
@GetMapping是Spring4.3提供的新注解,它是一个组合注解,等价于@RequestMapping(method = RequestMethod.Get ),用于简化开发,

@DeleteMapping("") 只能接收DELETE请求类型

@PostMapping("") 只能接收POST请求类型

@PutMapping("") 只能接收PUT请求类型

@RestController 表示Controller类,同时要求返回值为JSON
@RestController = @Controller + @ResponseBody组成


@CrossOrigin 允许跨域访问
 @CrossOrigin是用来处理跨域请求的注解
 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
所谓同源是指,域名,协议,端口均相同
 
@RequestBody 参数接收时,将JSON串转化为java对象 json中的key与对象的属性一致.
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
在后端的同一个接收方法里,@RequestBody 与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam
原因:
@requestbody的含义是在当前对象获取整个http请求的body里面的所有数据,因此spring就不可能将这个数据强制包装成Course或者List类型,并且从@requestbody设计上来说,只获取一次就可以拿到请求body里面的所有数据,就没必要出现有多个@requestbody出现在controller的函数的形参列表当中

@Data lombok动态生成get/set/toString/equals/hashcode等方法
1、@Data可以为类提供读写功能,从而不用写get、set方法。
2、他还会为类提供 equals()、hashCode()、toString() 方法。
        
@Accessors 控制是否开启链式加载结构
@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
@Accessors有三个属性,分别是fluent,chain,prefix,@Accessors注解既可以注解在类上也可以注解在属性上
1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
例如:
@Accessors(flunet = true)
public class MyClass {undefined
@Getter
private int num;
}
生成的get方法为num(),而不是getNum()
2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
例如:
@Accessors(prefix = “m”)
public class MyClass {undefined
@Getter
private int mNum;
}
生成的get方法为getNum(),而不是getMNum()


@NoArgsConstructor 生成无参构造方法

@AllArgsConstructor 生成全参构造方法

@Mapper mybatis将当前的接口交给Spring容器管理. Map<类名小写,JDK动态代理对象>

@SpringBootTest 该注解的作用在进行代码测试时启动spring容器,之后动态的获取对象 注意包路径 主启动类的同包及子包中.

@Param Mybatis中将参数封装为Map集合. @Param(“maxAge”) int maxAge

@Alias Mybatis中定义对象的别名 @Alias(“User”)

@MapperScan Mybatis中扫描指定包路径的接口 为其创建代理对象.

@Insert Mybatis 新增操作注解

@Update Mybatis 修改操作注解

@Delete Mybatis 删除操作注解

@Select Mybatis 查询操作注解

@Transactional Spring中用来控制事务

@RestControllerAdvice Controller层的全局异常处理

@ExceptionHandler 按照某种异常类型进行拦截

@TableName(“item_cat”) MybatisPlus注解POJO与数据表绑定 注意表名

@TableId(type = IdType.AUTO) MybatisPlus注解 标识主键/主键自增

@TableField(exist = false) MybatisPlus注解 标识属性是否存在,及名称是否一致
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值