java开发注解总结笔记
- 1、最基础注解(spring-context包下的org.springframework.stereotype)
- 2、最基础注解(spring-web包下的org.springframework.web.bind.annotation)
- 3、persistence注解(javax.persistence包下的javax.persistence)
- 4、resteasy注解(jaxrs-api包下的javax.ws.rs)
- 5、validation注解(validation-api包下的javax.validation)
- 6、lombok常用注解
- 7、tkMapper注解
- 8、springboot常用注解
- 9、注入bean的三个注解
- 10、java内置注解(java.lang下的)
1、最基础注解(spring-context包下的org.springframework.stereotype)
1.1、@Controller @Service @Repository @Configuration @Component
(1)解释
用于标注各个层级的注解,注入到spring容器管理
@Controller @Service @Repository @Configuration 都是@Component组合注解只是区分层级关系
注解 | 层级 |
---|---|
@Controller | 标注于控制层 |
@Service | 标注于业务层 |
@Repository | 标注于dao持久层 |
@Configuration | 标注于配置层 |
@Component | 泛指组件,当组件不好归类时可用 |
(2)示例
@Controller
public class UserController {
}
1.2、 @Bean
(1)解释
@Bean等价于< Bean >< /Bean >,添加的bean的id为方法名。
(2)例子
@Configuration
public class AppConfig {
//@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖
@Bean
public TransferService transferService(AccountRepository accountRepository) {
return new TransferServiceImpl(accountRepository);
}
}
这个配置就等同于之前在xml里的配置:
@Configuration可理解为用spring的时候xml里面的< beans >标签
@Bean可理解为用spring的时候xml里面的< bean >标签
<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl" depends-on="accountRepository"/>
</beans>
2、最基础注解(spring-web包下的org.springframework.web.bind.annotation)
2.1、@ResponseBody
(1)解释
该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。
一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
(2)例子
/***********************例子一*******************************/
@RequestMapping(value="user/login")
@ResponseBody
//将ajax(datas)发出的请求写入User对象中,返回json对象响应回去
public User login(User user) {
User user = new User();
user.setUserid(1);
user.setUsername("MrF");
user.setStatus("1");
return user ;
}
/***********************例子二*******************************/
@Controller
public class UserController {
@GetMapping("/hello")
@ResponseBody public String hello() {
return "hello spring";
}
}
2.2、@RequestBody
(1)解释
将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。换句话就是:用于接收前端请求的Json参数,并且封装到对应的JavaBean
(2)例子
@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入User对象中
public User login(@RequestBody User user) {
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
return user;
}
(3)使用时机
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded,可选(即非必须,因为这种情况的数据@RequestParam,@ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data,不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式,必须(其他格式包括application/json,application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded,必须;multipart/form-data,不能处理;其他格式,必须;
2.3、@RequestMapping
(1)解释
用来处理请求地址映射的注解
(2)例子
/**
* 用于类上,可以没有
*/
@RequestMapping(value = "/controllerDemo")
public class ControllerDemo {
// 用于方法上,必须有
@RequestMapping(value = "/methodDemo")
public String methodDemo() {
return "helloWorld";
}
}
(3)注解参数
RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
1、value, method
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明)
method:指定请求的method类型,GET、POST、PUT、DELETE等
2、consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
2.4、@PostMapping
(1)解释
一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
(2)例子
@PostMapping("/pay")
public JsonResponse pay(HttpServletRequest request){}
2.5、@GetMapping
(1)解释
一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
(2)例子
@GetMapping("/getAll/{companyName}")
public ReturnModel getAllBusByCompany(@PathVariable(value="companyName",required=false)String companyName){}
2.6、@PathVariable
(1)解释
用于接受前端url路径参数,通过路径参数作为接口接受的参数,Result风格
区分:
使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值
使用@PathVariable时,URL是这样的:http://host:port/path/参数值
(2)例子
访问路径:localhost:8080/hello/1
@GetMapping("/hello/{id}")
public String func(@PathVariable String id) {
return id;
}
(3)参数
返回值 | 参数 | 作用 |
---|---|---|
String | value | name别名 |
String | name | url参数的绑定值 |
2.7、@RequestParam
(1)解释
用于接受前端提交的参数
(2)参数
返回值 | 参数 | 作用 |
---|---|---|
String | value | name别名 |
String | name | 请求参数对应的属性 |
boolean | required | 是否必传 |
Stirng | defaultValue | 默认值 |
(2)例子
访问方式:localhost:8080/hello?name=张三
@GetMapping("/hello")
public String func(@RequestParam(name = "name", required = false, defaultValue = "张三") String name) {
return "OK";
}
2.8、@RestController
(1)解释
相当于@ResponseBody + @Controller,Controller中的方法无法返回jsp页面,
返回的内容就是Return 里的内容。
3、persistence注解(javax.persistence包下的javax.persistence)
3.1、@Entity,@Table,@Id,@GeneratedValue, @Column,@Temporal,@Generated
(1)解释
- @Entity表明该类是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名。如果class名和数据库表中名字不一致就用@Table,如果class字段名和表中的字段名不一直就用@Column
- @Column用来标识实体类中属性与数据表中字段的对应关系
name定义了被标注字段在数据库表中所对应字段的名称;
unique表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。
nullable表示该字段是否可以为null值,默认为true。
insertable表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)
table表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
length表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。
precision和scaleprecision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
- @Id表名该字段是主键,如果要开启自增主键就用@GeneratedValue
- @Temporal帮Java的Date类型进行格式化,一共有三种注解值
第一种:@Temporal(TemporalType.DATE)——>实体类会封装成日期“yyyy-MM-dd”的 Date类型。
第二种:@Temporal(TemporalType.TIME)——>实体类会封装成时间“hh-MM-ss”的 Date类型。
第三种:@Temporal(TemporalType.TIMESTAMP)——>实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date类型。
- @Generated自动生成
generated= never 标明此属性值不是从数据库中生成。
generated默认值是never。
generated= insert 标明此属性值在insert的时候生成,但是不会在随后的update时重新生成。
generated= always 标明此属性值在insert和update时都会被生成
(2)例子
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name = "batch")
public class Batch{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;
//在插入的时候自动赋值当前时间
@Column(insertable = false)
@Temporal(TemporalType.TIMESTAMP)
@Generated(GenerationTime.INSERT)
private Date createdTime;
//自动变化更新时间
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable = false, updatable = false)
@Generated(GenerationTime.ALWAYS)
private Date updatedTime;
//在插入的时候自动赋值1
@Column(insertable = false ,columnDefinition="Short default 1")
@Generated(GenerationTime.INSERT)
private Short status;
4、resteasy注解(jaxrs-api包下的javax.ws.rs)
resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现。
默认情况下,resteasy使用jackson和jaxb来实现json及xml格式的序列化。应用启动时,会自动扫描带@Provider的包,找到最合适的provider。
这个可以用来做分布式,可以通过okhttp3协议来进行交互
4.1、@Path、@POST、@Produces、@Consumes、@Context
(1)例子
import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import com.tdpay.dubbo.common.response.JsonResponse;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
@Path("/td")
public interface PayIntegrationService {
@Path("/pay")
@POST
@Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
@Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
public JsonResponse pay(@Context HttpServletRequest request);
}
5、validation注解(validation-api包下的javax.validation)
5.1、@Valid 和 @属性校验注解
(1)解释
用于前端请求参数校验,@Valid需要配合BindingResult使用,以及配合下面各种校验注解进行使用
(2)注解参数
注解 | 作用 |
---|---|
@Valid | 进行校验前端入参 |
注解 | 作用 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
(3)示例
/**
* 接受前端的请求并且根据User实体类注解进行校验
*/
@PostMapping("/hello/user")
public String hello(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
result.getAllErrors().forEach(System.out::println);
}
System.out.println(user);
return "hello spring";
}
@Data
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码名不能为空")
private String password;
}
6、lombok常用注解
idea要下载lombok插件
打开IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 安装成功
然后pom导入lombok包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
6.1、@Slf4j和@Log
(1)解释
@Slf4j: 注解在类上,为类提供一个属性名为 log 的 log4j 的日志对象,避免重复代码。(基于lombok包)
@Log:使用的是 java.util.logging.Logger ,直接使用变量 log,用法同上。
(2)示例
@Service
@Slf4j
public class UserService {
public void func() {
log.info("【使用{}】","@Slf4j");
}
}
6.2、@Data
(1)解释
用在pojo类,在类上面加这个注解。简化java代码编写,为该类提供读写属性,还提供了equals(),hashCode(),toString()方法。
等价于 @ToString、@Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor
注意:同时使用@Data 和 @AllArgsConstructor 后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor
(2)例子
@Data
public class ActivityListParam{
private Integer id;
private Integer page;
private Integer count;
...
}
6.3、@Getter,@Setter,@ToString,@EqualsAndHashCode
(1)解释
在pojo类上面加了这些注解以后,自动生成get、set、toString、equals、hashCode等方法
@EqualsAndHashCode(callSuper = false)的意思是忽略父类的字段,来调用equals和hashcode
6.4、@AllArgsConstructor、@NoArgsConstructor
(1)解释
@AllArgsConstructor
在pojo类上面加了这些注解以后,会生成一个包含所有变量的构造函数,同时如果变量使用了NotNull annotation , 会进行是否为空的校验,
全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,参数的顺序与属性定义的顺序一致
@NoArgsConstructor
在pojo类上面加了这些注解以后,会生成一个无参构造函数
6.5、@NonNull
(1)解释
该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
(2)例子
public class Person {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
@NonNull
public List<Person> getMembers() {
return members;
}
}
6.6、@Cleanup
(1)解释
该注解能帮助我们自动调用close()方法,很大的简化了代码。
(2)例子
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
如不使用Lombok,则需如下:
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
}
6.7、@Builder
(1)解释
声明实体,表示可以进行Builder方式初始化
(2)例子
/**
* toBuilder 允许修改属性
*/
@Builder(toBuilder = true)
@Getter
public class User {
private String name;
private String password;
}
@Test
public void contextLoads() {
// 创建对象并且赋值
User user = User.builder().name("123").password("456").build();
// 修改对象属性值
User updateUser = user.toBuilder().name("张三").password("123").build();
}
7、tkMapper注解
不知道怎么用tkMapper查看我的另一个文章:https://blog.csdn.net/ranandrun/article/details/86509394
7.1、@Select、@Param
- @Param作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳
- @Select作用是用注解方式来查询,不需要通过mapperxml文件
import com.td.pay.tdpay.entity.PayParamsModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;
@Repository
public interface PayParamsDao extends Mapper<PayParamsModel> {
/**
* 根据sn查询订单
*/
@Select("SELECT * FROM pay_params WHERE sn = #{sn};")
public PayParamsModel selectBySn(@Param("sn") String srcOrderSn);
}
8、springboot常用注解
8.1、@ConfigurationProperties
(1)解释
将配置文件中配置的每一个属性的值,映射到这个组件中
(2)例子
**
* @ConfigurationProperties:
* prefix = "person":配置文件下面的所有属性和类的属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
配置文件
person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 12
我们可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
8.2、@MapperScan("com.test.dao")
扫描dao接口,放启动类上面
8.3、@SpringBootApplication(scanBasePackages = {"com.test"})
SpringBootApplication启动时会默认扫描主类当前包及子包,如果需要扫描主类当前包外的其他包就用@SpringBootApplication
9、注入bean的三个注解
归纳:
- @Autowired是spring自带的,@Inject是JSR330规范实现的,@Resource是JSR250规范实现的,需要导入不同的包
- @Autowired、@Inject用法基本一样,不同的是@Autowired有一个request属性
- @Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的
- @Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用
9.1、@Inject(javax.inject下的)
(1)解释
根据类型进行自动装配的,默认需要配置与变量名一致。如果需要按名称进行装配,则需要配合@Named;
@Inject可以作用在变量、setter方法、构造函数上。
(2)例子
@Inject
private Mongo mongo;
9.2、@Autowired ( org.springframework下的sping-beans)
(1)解释
根据类型进行自动装配的,名称不一样也没事,如果需要按名称进行装配,则需要配合@Qualifier;
@Autowired有个属性为required,可以配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛错;
@Autowired可以作用在变量、setter方法、构造函数上。
(2)例子
@Autowired
private MongoTemplate mongoTemplate;
9.3、 @Resource (jdk下的rt.jar下的javax.annotation)
(1)解释
根据名称进行自动装配的,默认需要配置与变量名一致,一般会指定一个name属性。
@Resource可以作用在变量、setter方法上。
(2)例子
@Resource(name = "userMapper")
private UserMapper userMapper;
10、java内置注解(java.lang下的)
10.1、@Override
(1)解释
帮助自己检查是否正确的复写了父类中已有的方法
告诉读代码的人,这是一个复写的方法
(2)例子
public class Apple extends Fruit{
@Override
public void show_name(int num){
System.out.println("Apple");
}
}
10.2、@Deprecated
(1)解释
这个方法或类不再建议使用。调用时也会出现删除线,但并不代表不能用。在新版本中有其他方法或类可以代替这个使用,以后的版本也不会再更新这个方法或类
(2)例子
/**
* 请改用每个实体对象的实例方法的existed()方法。
*/
@Deprecated
public static <T extends Entity> boolean exists(Class<T> clazz, Serializable id) {
return getRepository().exists(clazz, id);
}
10.3、@SuppressWarnings
(1)解释
抑制内容警告,我们使用是要保证抑制影响的范围最小。
@ SuppressWarnings可以使用的属性列表如下:
属性 | 备注 |
---|---|
all | 禁止所有警告 |
boxing | 禁止与装箱/拆箱操作相关的警告 |
cast | 强制转换以抑制与强制转换操作相关的警告 |
dep-ann | 用于抑制相对于已弃用注释的警告 |
deprecation | 弃用以抑制相对于弃用的警告 |
fallthrough | 在switch语句中,通过fallthrough来抑制与丢失中断相关的警告 |
finally | 最后抑制与最终块相关的不返回的警告 |
hiding | 隐藏以抑制相对于隐藏变量的本地警告 |
incomplete-switch | 在switch语句(enum案例)中,incomplete-switch用来抑制相对于丢失条目的警告 |
javadoc | 禁止与javadoc警告相关的警告 |
nls | 使用nls来抑制相对于非nls字符串的警告。 |
null | 空值来抑制相对于空值分析的警告 |
rawtypes | 拒绝与使用原始类型相关的警告 |
resource | 用于抑制与使用类型为Closeable的资源相关的警告的资源 |
restriction | 限制禁止与使用不鼓励或禁止引用相关的警告 |
serial | 串行用于抑制相对于可串行化类缺少serialVersionUID字段的警告 |
static-access | 静态访问,抑制相对于不正确的静态访问的警告 |
static-method | 静态方法,用于抑制相对于可以声明为静态的方法的警告 |
super | 超级-来抑制相对于在没有超级调用的情况下重写方法的警告 |
synthetic-access | 用于抑制相对于内部类的未优化访问的警告的合成访问 |
sync-override | 在覆盖同步方法时,由于缺少同步而取消警告 |
unchecked | 未选中以抑制与未选中操作相关的警告 |
unqualified-field-access | 不限定字段访问来抑制与字段访问不限定相关的警告 |
unused | 不常用来抑制与未使用代码和死代码相关的警告 |
(2)例子
public class SuppressWarnings {
/**
* 变量单个类型的警告
*/
@java.lang.SuppressWarnings("unused")
public void unused() {
String s = "";
}
/**
* 抑制多个类型的警告
* @param item 元素
*/
@java.lang.SuppressWarnings({"unchecked", "rawtypes"})
public void addItems(String item){
List items = new ArrayList();
items.add(item);
}
/**
* 抑制所有类型的警告
* @param item
*/
@java.lang.SuppressWarnings("all")
public void all(String item) {
List items = new ArrayList();
items.add(item);
}
}
10.4、@SafeVarargs
(1)解释
抑制堆污染警告
问:什么时候会出现对堆污染警告?
答:使用泛型+可变参数的时候就会出现堆污染警告。
(2)例子
@SafeVarargs
public static<T> T useVarargs(T... args){
return args.length > 0?args[0]:null;
}
@Test
public void testSafeVarargs(){
System.out.println(useVarargs(Arrays.asList("s1","s2")));
}
10.5、@FunctionalInterface
(1)解释
在Java SE 8中引入的 ,申明某个接口是函数式接口(函数式接口是就只含有一个抽象方法的接口)。加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。
(2)例子
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
java开发注解总结笔记的更多相关文章
- java开发注解大全
目录 1.最基础注解(spring-context包下的org.springframework.stereotype) 1.1.@Controller @Service @Repository @Co ...
- 阿里巴巴Java开发手册要点笔记 (一)
1:[强制]Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals. 正例:"test".equals(object); 反例:obj ...
- 阿里巴巴JAVA开发规范学习笔记
一.编程规约 (一)命名规约 1.类名驼峰.领域模型除外VO.BO.DTO.DO统称POJO 4.数组String[] args 8.枚举类 Enum ,其实就是特殊的常量类,构造方法强制私有 ( 二 ...
- 阿里巴巴java开发手册阅读笔记
1. long 或者 Long 初始赋值时,必须使用大写的 L. Long a = 2L; 2. POJO 类(DO/DTO/BO/VO )必须写 toString 方法 3. final 可提高程序 ...
- Java开发笔记(八十三)利用注解技术检查空指针
注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架.Mybatis框架,Android开发常见的Butt ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- Java开发笔记(八十一)如何使用系统自带的注解
之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...
- 读书笔记 之 《阿里巴巴Java开发手册》
一.前言 这本书主要定义了一些代码的规范以及一些注意事项.我只根据我自己的不足,摘录了一些内容,方便以后查阅. 二.读书笔记 命名 1.代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
随机推荐
- eShopOnContainers 知多少[10]:部署到 K8S | AKS
1. 引言 断断续续,感觉这个系列又要半途而废了.趁着假期,赶紧再更一篇,介绍下如何将eShopOnContainers部署到K8S上,进而实现大家常说的微服务上云. 2. 先了解下 Helm 读过我 ...
- 一大波开发者福利来了,一份微软官方Github上发布的开源项目清单等你签收
目录 微软Github开源项目入口 微软开源项目受欢迎程度排名 Visual Studio Code TypeScript RxJS .NET Core 基础类库 CNTK Microsoft cal ...
- CSS fixed 定位元素失效的问题
一个示例 考察下面的代码: <head> <title>css filter issue</title> <style> body { height: ...
- kube-proxy的功能
Kube-proxy的功能 我们知道POD的IP是动态分配的而且经常会变,所以为了可以通过一个不太容易变化的IP访问POD就会使用一个叫做service的东西,通过标签选择器和POD进行关联. Ser ...
- Java多线程与并发面试题
1,什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一 ...
- php一致性hash算法的应用
阅读这篇博客前首先你需要知道什么是分布式存储以及分布式存储中的数据分片存储的方式有哪些? 分布式存储系统设计(2)—— 数据分片 阅读玩这篇文章后你会知道分布式存储的最优方案是使用 一致性hash算法 ...
- RFID和QRCODE对比
1.技术介绍 1.1 RFID 射频识别,RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而 ...
- Markdown 插入图片技巧
在使用Markdown编写博客或文件的时候,经常会需要插入图片.如果使用Markdown语法,我们会发现调整图片的大小会是个问题. 所以推荐使用另一种办法插入图片,使用HTML语法,示例如下: < ...
- SpringBoot2.0 项目中使用事务
参考博客: SpringBoot开启事务常见坑点 另外注意手动回滚事务需要 (1)在业务层方法上添加注解 @Transactional (2)在需要回滚的地方添加代码: TransactionAspe ...
- 和逛微博、刷朋友圈一样玩转 GitHub
自打毕业之后,可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue,然后在Explore 看看社区内项目的走势,紧接着开始写代码搬砖的工作,偶尔也会关 ...