JAVA开发常用结构注解与效果
一同交流:CN.ITLTT.COM
Spring全家桶
声明Bean
@Component
组件,没有明确的人物。@Service
在业务逻辑层运用->Service层。D@Repository
在数据拜访层运用->Dao层。@Controller
在展示层运用,操控器的声明。
注入Bean
@Autowired
由Spring供给,依据类型进行主动安装,假如组合@Qualifier
运用将按称号进行安装。@Inject
由JSR-330
供给运用时需求导入javax.inject.Inject
完成注入同样是依据类型进行主动安装,假如需求按称号进行安装,则需求配合@Named
。@Resource
由JSR-250
供给,运用需求导入javax.annotation
,依据称号进行主动安装的,一般会指定一个name
特点。
声明功用
@Transactional
声明业务@Cacheable
声明缓存
装备相关
@Configuration
声明当时类为装备类。@Bean
注解在办法上,声明当时办法的返回值为一个bean
。@ComponentScan
用于对Component
进行扫描->自定义路径。@WishlyConfiguration
为@Configuration
与@ComponentScan
的组合注解,能够替代这两个注解。
AOP相关
@Aspect
声明一个切面。@After
在办法履行之后履行。@Before
在办法履行之前履行。@Around
在办法履行之前与之后都履行。@PointCut
声明切点。
@Bean的特点支撑
@Scope
设置Spring
新建Bean
的形式,可挑选包括如下:
Singleton
单例,一个Spring
容器中只要一个bean
实例,默许形式。Protetype
每次调用新建一个bean
。Request web
项目中,给每个http request
新建一个bean
。Session web
项目中,给每个http session
新建一个bean
。GlobalSession
(给每一个global http session
新建一个Bean
实例。
Class生命周期相关
@PostConstruct
由JSR-250
供给,在类的结构函数履行完之后履行,等价于xml
装备文件中bean
的initMethod
。@PreDestory
由JSR-250
供给,在Bean
毁掉之前履行。
装备项注入
@Value
为特点注入值,支撑如下办法的注入:
- 普通字符
@Value(“JanYork”)
。- 操作系统特点
@Value("#{systemProperties[‘os.name’]}")
。- 表达式成果
@Value("#{ T(java.lang.Math).random() * 100 }")
。- 其它
bean
特点@Value("#{domeClass.name}")
。- 文件资源
@Value(“classpath:cn/janyork/demo.txt”)
。- 网站资源
@Value(“https://ideaopen.cn”)
。- 装备文件特点
@Value("${book.name}")
。
注入装备文件@PropertySource(“classpath:cn/janyork/dev.propertie”)
也能够读取yml
文件装备。
开发环境装备
@Profile
经过设定Environment
的ActiveProfiles
来设定当时context
需求运用的装备环境。@Conditional
依据代码中设置的条件装载不同的bean
,包括一系列的注解。
@ConditionalOnBean
存在bean
。@ConditionalOnMissingBean
不存在bean
。@ConditionalOnClass
存在某个类。@ConditionalOnMissingClass
不存在某个类。@ConditionalOnProperty(prefix = “jan”, name = “york”, havingValue = “token”)
当存在装备文件中以jan
为前缀的特点,特点称号为york
,然后它的值为token
时才会实例化一个类。@ConditionalOnProperty(prefix = “jan”, name = “york”, havingValue = “counter”, matchIfMissing = true)
假如一切的都不满意的话就挑选counter
为默许完成。@ConditionalOnJava
假如是Java
运用。@ConditionalOnWebApplication
假如是Web
运用。
异步注解
@Async
在实践履行的bean
办法运用该注解来申明其是一个异步使命。
守时使命
@Scheduled
来申明这是一个使命,包括cron
、fixDelay
、fixRate
等类型。
敞开某些功用
@EnableAspectJAutoProxy
敞开对AspectJ
主动代理的支撑。@EnableAsync
敞开异步办法的支撑。@EnableScheduling
敞开计划使命的支撑。@EnableWebMvc
敞开Web MVC
的装备支撑。@EnableConfigurationProperties
敞开对@ConfigurationProperties
注解装备Bean
的支撑。@EnableJpaRepositories
敞开对SpringData JPA Repository
的支撑。@EnableTransactionManagement
敞开注解式业务的支撑。@EnableCaching
敞开注解式的缓存支撑。
测试相关
@RunWith Spring
中通常用于对JUnit
的支撑。@ContextConfiguration
用来加载装备ApplicationContext
。@Test
用于单元测试。
MVC相关
@RequestMapping
用于映射Web
恳求,包括拜访路径和参数。ResponseBody
支撑将返回值放在response
内,而不是一个页面。@PathVariable
用于接纳路径参数。@RestController
该注解为一个组合注解,相当于@Controller
和@ResponseBody
的组合,注解在类上,意味着,该Controller
的一切办法都默许加上了@ResponseBody
。@ControllerAdvice
经过该注解,咱们能够将对于操控器的大局装备放置在同一个位置,注解了@Controller
的类的办法可运用@ExceptionHandler
、@InitBinder
、@ModelAttribute
注解到办法上, 这对一切注解了@RequestMapping
的操控器内的办法有效。@ExceptionHandler
用于大局处理操控器里的反常。@InitBinder
用来设置WebDataBinder
,WebDataBinder
用来主动绑定前台恳求参数到Model
中。@ModelAttribute
原本的效果是绑定键值对到Model
里,在@ControllerAdvice
中是让大局的@RequestMapping
都能取得在此处设置的键值对。
Boot相关
@EnableAutoConfiguration
主动载入运用程序所需的一切Bean
。该注解组合了@Import
注解,@Import
注解导入了EnableAutoCofigurationImportSelector
类,它运用SpringFactoriesLoader.loaderFactoryNames
办法来扫描具有META-INF/spring.factories
文件的jar
包。而spring.factories
里声明晰有哪些主动装备 +@SpingBootApplication
SpringBoot
的核心注解,主要意图是敞开主动装备。它也是一个组合注解,主要组合了@Configurer
,@EnableAutoConfiguration
(核心)和@ComponentScan
。能够经过@SpringBootApplication(exclude={想要封闭的主动装备的类名.class})
来封闭特定的主动装备。@ImportResource
加载xml
装备的。@AutoConfigureAfter
在指定的主动装备类之后再装备。
MyBatis
SQL句子映射
@Insert
完成新增功用。
@Select
完成查询功用。
@SelectKey
刺进后,获取id的值。
@Insert
完成刺进功用。
@Update
完成更新功用。
@Delete
完成删除功用。
成果集映射
@Result
、@Results
、@ResultMap
是成果集映射的三大注解。
@Results
各个特点的意义:
id
为当时成果集声明仅有标识,value
值为成果集映射联系,@Result
代表一个字段的映射联系,column
指定数据库字段的称号,property
指定实体类特点的称号,jdbcType
数据库字段类型,@Result
里的id
值为true
表明主键,默许false
。运用
@ResultMap
来引证映射成果集,其间value
可省略。
联系映射
@one
用于一对一联系映射。
@many
用于一对多联系映射。
MyBatisPlus
请看官方文档。
Lombok
@Getter
、@Setter
->主动发生getter/setter
。@ToString
->主动重写toString()
办法,会印出一切变量。@EqualsAndHashCode
->主动生成equals(Object other)
和hashcode()
办法,包括一切非静态变量和非transient
的变量。
- @NoArgsConstructor、@AllArgsConstructor,、@RequiredArgsConstructor
这三个很像,都是在主动生成该类的结构器,差别只在生成的结构器的参数不相同罢了。
@NoArgsConstructor
生成一个没有参数的结构器。@AllArgsConstructor
生成一个包括一切参数的结构器。@RequiredArgsConstructor
生成一个包括 “特定参数” 的结构器,特定参数指的是那些有加上 final 修饰词的变量们。
留意:
这儿留意一个
Java
的小坑,当咱们没有指定结构器时,Java
编译器会帮咱们主动生成一个没有任何参数的结构器给该类,可是假如咱们自己写了结构器之后,Java
就不会主动帮咱们补上那个无参数的结构器了。可是许多当地(像是
Spring Data JPA
),会需求每个类都一定要有一个无参数的结构器,所以你在加上@AllArgsConstructor
时,一定要补上@NoArgsConstrcutor
,不然会有各种坑等着你。
@Data
:整合包,只要加了@Data
这个注解,等于一起加了以下注解。
@Getter
/@Setter
@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
@Value
:整合包,可是他会把一切的变量都设成final
的,其他的就跟@Data
相同,等于一起加了以下注解。
@Getter
(没有setter
)@ToString
@EqualsAndHashCode
@RequiredArgsConstructor
@Builder
:主动生成流式set
值写法,从此之后再也不必写一堆 setter
了。
留意,虽然只要加上
@Builder
注解,咱们就能够用流式写法快速设定对象的值,可是setter
还是有必要要写不能省略的,因为Spring
或是其他结构有许多当地都会用到对象的getter/setter
对他们取值/赋值所以通常是
@Data
和@Builder
会一同用在同个类上,既便利咱们流式写代码,也便利结构做事。
@Slf4j
:主动生成该类的 log
静态常量,要打日志就能够直接打,不必再手动 new log
静态常量了。
除了
@Slf4j
之外,lombok
也供给其他日志结构的变种注解能够用,像是@Log
、@Log4j
…等,他们都是帮咱们创建一个静态常量log
,只是运用的库不相同罢了。
@Log //对应的log句子如下
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j //对应的log句子如下
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
SpringBoot
默许支撑的便是slf4j + logback
的日志结构,所以也不必再多做啥设定,直接就能够用在SpringBoot project
上,log
系列注解最常用的便是@Slf4j
。
Shiro
@RequiresAuthentication
验证用户是否登录,等同于办法subject.isAuthenticated()
成果为true
时。
@RequiresUser
验证用户是否被记忆,user有两种意义:
一种是成功登录的(
subject.isAuthenticated()
成果为true
)。别的一种是被记忆的(
subject.isRemembered()
成果为true
)。
@RequiresGuest
验证是否是一个guest
的恳求,与@RequiresUser
彻底相反。换言之,RequiresUser == !RequiresGuest
。此刻subject.getPrincipal()
成果为null
。
@RequiresRoles
例如:
@RequiresRoles("JanYork");
void someMethod();
假如subject
中有JanYork
人物才干够拜访办法someMethod
。假如没有这个权限则会抛出反常AuthorizationException
。
@RequiresPermissions
例如:
@RequiresPermissions({"file:read","write:aFile.txt"})
void someMethod();
要求subject中有必要一起含有file:read
和write:aFile.txt
的权限才干履行办法someMethod()
。不然抛出反常AuthorizationException
。
SpringSecurity
@Secured
:
办法等级的权限认证,只要被该注解指定的人物才干拜访该办法。
运用该注解需求敞开注解功用,在装备类或者发动类上增加以下注解。
@EnableGlobalMethodSecurity(securedEnabled=true)
在controller
办法上增加@Secured
注解演示:
@GetMapping("user")
//设置只要这两种人物才干拜访这个办法
@Secured({"ROLE_admin","ROLE_admin_Pro"})
public String getUser() {
return ".......";
}
此刻假如不是这两个人物其间之一拜访恳求将被拒绝。
@PreAuthorize
:
进入办法前的权限验证,一起也支撑表达式的拜访操控
要想运用该注解需求在
@EnableGlobalMethodSecurity
注解上增加prePostEnabled = true
特点
在controller
办法上增加@PreAuthorize
注解演示:
@GetMapping("user")
@PreAuthorize("hasAuthority('admin')")
public String getUser() {
return ".......";
}
此刻假如不具备manager权限的拜访将会被拒绝。
多个条件一起满意能够这样:
@PreAuthorize("hasAuthority('admin') and hasRole('admin_Pro')")
假如不能一起满意这两个条件,那么这个办法将不能拜访。
@PostAuthorize
:
同上面的注解相同,要敞开此注解的功用需求在
@EnableGlobalMethodSecurity
注解上增加prePostEnabled = true
特点。
@PostAuthorize
注解的运用频率并不高,在办法履行之后再进行权限验证,适合验证带有返回值的权限。
@PostFilter
:
在权限验证过后对数据进行过滤。
@PreFilter
:
进入操控器之前对数据进行过滤。
Spring Cache
@EnableCaching
敞开Spring Cache
结构支撑。解析对应的注解,完成缓存读写拜访。
@CacheConfig
缓存装备,能够装备当时类型中所用缓存注解的通用信息。
示例:装备当类前一切缓存注解的缓存前缀。
@CacheConfig(cacheNames = "cache:prefix")
@Cacheable
表示要对办法返回值进行缓存。
包括特点:
cacheNames
: 缓存key
前缀姓名。key
:缓存key
后缀。condition
:SpringEL
表达式,成果为true
,缓存数据到redis
。成果为false
,不缓存数据到redis
。unless
:SpringEL
表达式,成果为false
,缓存数据到redis
。成果为true
,不缓存数据到redis
。
@CacheEvict
筛选缓存注解。
包括特点:
allEntries
代表是否删除cacheNames
对应的悉数的缓存。默许false
,可选true
。- 注解特点和
Cacheable
类似。
@CachePut
更新缓存,假如key
存在覆盖缓存数据。key
不存在,新增数据到缓存。
注解特点:跟
@Cacheable
类似。
完毕
全篇完,其他注解请自行了解。