springboot~Compiler时开启插件的批注成效

2019-11-15 21:12 来源:未知

对于IJ这个IDE工具来说,我们会安装一些插件来帮助我们更好的进行开发,像lombok就是一款不错的插件,使用注解的方式在项目编译时帮助我们生成代码,像getter,setter,tostring等等,它们一般都是一些重复的代码,而lombok就是帮助我们生成这些重复代码的,对于一个IJ的工具来说,如果你不启动编译时注解功能,那么项目在build时会报错!

使用ehcache-spring-annotations开启ehcache的注解功能
图片 1
使用ehcache-spring-annotations开启ehcache的注解功能时, eclipse提示如下问题,求教怎么搞定~~~~

我们知道通常情况下,Struts2是通过struts.xml配置的。但是随着系统规模的加大我们需要配置的文件会比较大,虽然我们可以根据不同的系统功能将不同模块的配置文件单独书写,然后通过<include>节点将不同的配置文件引入到最终的struts.xml文件中,但是毕竟还是要维护和管理这些文件,因此也会给维护工作带来很大的困扰。为了解决这个问题,可以考虑使用struts2的注解。实际上struts2中最主要的概念就是package、action以及Interceptor等等概念,所以只要明白这些注解就可以了。

【Spring】的【Bean】管理(注解)【四个相同功能的注解】

如何使用地图的注解功能

开启build时的注释

 "Settings > Build > Compiler > Annotation Processors"

图片 2

然后再安装lombok插件

图片 3

在项目里配置关于lombok的依赖项

compileOnly('org.projectlombok:lombok:1.16.20')

最后就可以在代码中使用lombok的注解了

/**
 * 用户实体
 *
* @Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
* @Setter:注解在属性上;为属性提供 setting 方法
* @etter:注解在属性上;为属性提供 getting 方法
* @og4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
* @oArgsConstructor:注解在类上;为类提供一个无参的构造方法
* @llArgsConstructor:注解在类上;为类提供一个全参的构造方法
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
    @Id
    private String id;
    @NotNull
    private String name;
    private String email;
}

好了,启用插件注解就说到这里,感谢阅读!

 

如果希望使用struts2的注解功能,必须使用一个包struts2-convention-plugin-2.1.8.1.jar,我使用的环境是struts2.1.8.1。如果你使用了不同的版本,找名字就行。

 

图片 4

在以上所述的jar文件中定义了一系列的注解,其中比较主要的是:

  • 注解:代码里面特殊的标记,使用注解也可以完成一些相关的功能。
  • 注解写法:@注解名称(属性名称=属性值)
  • 注解使用在类、方法、属性上面

实现了协议MKAnnotation的对象才能够被用地图上的注解对象,一般都是如下定义的.

  • @ParentPackage,这个注解对应了xml文件中的package节点,它只有一个属性叫value,其实就是package的name属性;
  • @Namespace,命名空间,也就是xml文件中<package>的namespace属性;
  • @Action,这个注解对应<action>节点。这个注解可以应用于action类上,也可以应用于方法上。这个注解中有几个属性:

    • value(),表示action的URL,也就是<action>节点中的name属性;
    • results(),表示action的多个result;这个属性是一个数组属性,因此可以定义多个Result;
    • interceptorRefs(),表示action的多个拦截器。这个属性也是一个数组属性,因此可以定义多个拦截器;
    • params(),这是一个String类型的数组,它按照name/value的形式组织,是传给action的参数;
    • exceptionMappings(),这是异常属性,它是一个ExceptionMapping的数组属性,表示action的异常,在使用时必须引用相应的拦截器;
  • @Result,这个注解对应了<result>节点。这个注解只能应用于action类上。这个注解中也有几个属性:

    • name(),表示action方法的返回值,也就是<result>节点的name属性,默认情况下是【success】;
    • location(),表示view层文件的位置,可以是相对路径,也可以是绝对路径;
    • type(),是action的类型,比如redirect;
    • params(),是一个String数组。也是以name/value形式传送给result的参数;

 

DisplayMap.h DisplayMap.m

实际上,struts2中的主要注解就是这些,当然了,还有上面提到的@interceptorRef和@exceptionMapping;基本上,掌握了这些注解就可以了。

  (注解可以替代配置文件,并非完全替代):

//
//  DisplayMap.h
//  MoreMapInfo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface DisplayMap : NSObject <MKAnnotation>

@property (nonatomic, copy, readonly)   NSString                *title;
@property (nonatomic, copy, readonly)   NSString                *subtitle;
@property (nonatomic, assign, readonly) CLLocationCoordinate2D   coordinate;

- (id)initWithTitle:(NSString*)title
           SubTitle:(NSString*)subtitle
         Coordinate:(CLLocationCoordinate2D)coordinate;

@end

//
//  DisplayMap.m
//  MoreMapInfo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "DisplayMap.h"

@implementation DisplayMap

- (id)initWithTitle:(NSString*)title
           SubTitle:(NSString*)subtitle
         Coordinate:(CLLocationCoordinate2D)coordinate
{
    if (self = [super init])
    {
        _title      = title;
        _subtitle   = subtitle;
        _coordinate = coordinate;
    }

    return self;
}

@end

但是如果想让这些注解真正工作,必须在配置文件增加几个常量的定义:

  1.创建类,创建方法

RootViewController.m

  • struts.convention.default.parent.package:这个常量表示缺省的包名是什么,因为在实际应用中,我们常常定义一个缺省的包,这个包中定义了一大堆的拦截器等等,然后其他的包继承自这个包。这个常量可以配也可以不配;
  • struts.convention.package.locators:这个常量表示你的action类的java包的包名的后缀是啥:比如action。这个常量也可以不配;
  • struts.convention.package.locators.basePackage:这个常量表示你的action类的java包package的名字是啥;这个常量也可以不配;
1 public class User {
2     public void add(){
3         System.out.println("add-----------");
4     }
5 }
//
//  RootViewController.m
//  MoreMapInfo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import <MapKit/MapKit.h>
#import "DisplayMap.h"
#import "LocationCoder.h"
#import "YXLocationManager.h"

@interface RootViewController ()<CLLocationManagerDelegate, MKMapViewDelegate>

@property (nonatomic, strong) MKMapView  *mapView;

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [YXLocationManager getCurrentLocation:^(CLLocation *location, NSError *error) {
        if (error == nil)
        {
            // 将经纬度解析为地址
            LocationCoder *lCoder = [[LocationCoder alloc] initWithLocation:location];
            [lCoder startAnalyseLocation];
            lCoder.resultBlock = ^(NSArray *placemarks, NSError *error,
                                   LocationCoder *locationCoder)
            {
                NSLog(@"%@", locationCoder.addressLines);
            };

            //地图
            _mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
            _mapView.delegate          = self;
            _mapView.showsUserLocation = YES;
            _mapView.mapType           = MKMapTypeHybrid;
            _mapView.region = MKCoordinateRegionMake(location.coordinate,
                                                     MKCoordinateSpanMake(0.1, 0.1));

            //加入大头针
            DisplayMap *anno = [[DisplayMap alloc]initWithTitle:@"title"
                                                       SubTitle:@"subtitle"
                                                     Coordinate:CLLocationCoordinate2DMake(39.928168, 116.39328)];
            [_mapView addAnnotation:anno];
            [self.view addSubview:_mapView];

            //给地图添加长按手势,插上大头针
            UILongPressGestureRecognizer* longPress = 
            [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                          action:@selector(longPress:)];
            [_mapView addGestureRecognizer:longPress];
        }
        else
        {
            NSLog(@"%@", error);
        }
    }];
}

#pragma mark - viewDidLoad UILongPressGestureRecognize longPress:
- (void)longPress:(UILongPressGestureRecognizer*)longPress
{
    //长按一次 只在开始插入一次大头针   否则能用大头针写字。。。
    if (longPress.state == UIGestureRecognizerStateBegan)
    {
        CGPoint point = [longPress locationInView:_mapView];
        CLLocationCoordinate2D coordinate = [_mapView convertPoint:point
                                              toCoordinateFromView:_mapView];


        DisplayMap* an = [[DisplayMap alloc] initWithTitle:@"title"
                                                  SubTitle:@"subtitle"
                                                Coordinate:coordinate];
        [_mapView addAnnotation:an];

        [_mapView setCenterCoordinate:coordinate
                             animated:YES];
    }
}

#pragma mark - MKMapViewDelegate
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    //如果是所在地,跳过(固定写法)
    if ([annotation isKindOfClass:[mapView.userLocation class]])
    {
        return nil;
    }

    // 重用
    MKPinAnnotationView* pinView = (MKPinAnnotationView*)
        [mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];
    if (pinView == nil)
    {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                                  reuseIdentifier:@"ID"];
    }

    //能显示Call信息上面那些图字(很重要哦)
    pinView.canShowCallout = YES;

    //只有三种
    pinView.pinColor = MKPinAnnotationColorPurple;

    //显示动画 - 从天上落下
    pinView.animatesDrop = YES;

    pinView.image = [UIImage imageNamed:@"地图标点"];

    // 左侧CalloutAccessoryView(使用了自定义view)
    UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    view.backgroundColor = [UIColor redColor];
    pinView.leftCalloutAccessoryView = view;

    // 右侧CalloutAccessoryView(使用了系统的按钮)
    UIButton* button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    pinView.rightCalloutAccessoryView = button;

    return pinView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"点击事件");
}

@end

以上三个常量都是辅助作用的,为了让注解真正的工作,必须在配置文件中增加<package>节点的配置,至少是<package name="myPackage" extends="struts-default" />,这样注解就可以使用了。

  2.创建spring配置文件,引入约束

打印信息:

1 <beans xmlns="http://www.springframework.org/schema/beans"
2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3     xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
4         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
5         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
6 </beans>

2014-05-26 10:24:46.005 MoreMapInfo[6138:60b] AKLocation - [Line 118]
 Started locating
 ==============
 Distance filter accuracy: -1.00
 Desired accuracy: 100.00
 Timeout: 10.00
May 26 10:24:47 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:47.331 MoreMapInfo[6138:9c07] vImage decode failed, falling back to CG path.
May 26 10:24:47 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:47.372 MoreMapInfo[6138:8f0b] vImage decode failed, falling back to CG path.
2014-05-26 10:24:47.462 MoreMapInfo[6138:60b] 中国北京市东城区东四街道东四朝阳门北小街2-1号
May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:48.363 MoreMapInfo[6138:a803] vImage decode failed, falling back to CG path.
May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:48.375 MoreMapInfo[6138:a603] vImage decode failed, falling back to CG path.
May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:48.402 MoreMapInfo[6138:9607] vImage decode failed, falling back to CG path.
May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
May 26 10:24:48 Phoenix MoreMapInfo[6138] <Error>: CGBitmapContextCreate: unsupported parameter combination: 5 integer bits/component; 16 bits/pixel; 3-component color space; kCGImageAlphaNoneSkipLast; 512 bytes/row.
2014-05-26 10:24:48.420 MoreMapInfo[6138:910b] vImage decode failed, falling back to CG path.
2014-05-26 10:24:48.421 MoreMapInfo[6138:9e07] vImage decode failed, falling back to CG path.
2014-05-26 10:25:10.317 MoreMapInfo[6138:60b] 点击事件

  3.配置开启注解扫描

图片 5图片 6

 

 

 1 <!-- 
 2         开启注解扫描功能
 3         (1)到包里面扫描类、方法、属性上面是否有注解
 4      -->
 5     <context:component-scan base-package="com.anno"></context:component-scan>
 6 
 7 
 8 
 9 <!-- 只会扫描属性上面的注解,所以我们不用 -->
10     <context:annotation-config></context:annotation-config>

要点:

 

// 能显示Call信息上面那些图字(很重要哦)
pinView.canShowCallout = YES

一、 使用注解创建对象

 

在创建对象的类上面使用注解实现

 

 

1 @Component(value="user")    //<bean id="" class="">
2 public class User {
3     public void add(){
4         System.out.println("add-----------");
5     }
6 }

 

写测试代码

1 @Test
2     public void testAno(){
3         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
4         User user = (User)applicationContext.getBean("user");
5         user.add();
6     }

   创建对象有四个注解,下面还有三个:

 

Spring中提供了@Component的三个衍生注解:(功能目前来说是一致的,都是用来创建对象)

@Controller

Web层

@Service

业务层

@Repository

持久层

这三个注解是为了让标注类本身用途清晰,spring在后续的版本中会对其增强。

 

  **创建对象单实例还是多实例  在类上面添加注解@scope**

 

1 @Component(value="user")    //<bean id="" class="">
2 @Scope(value="prototype")
3 public class User {
4     public void add(){
5         System.out.println("add-----------");
6     }
7 }

 

 

二、使用注解注入属性

 

第一种注解(很少用):@Autowired

 

需求:创建service类,创建dao类,在service得到dao对象

1 @Component(value="userdao")
2 public class UserDao {
3     public void add(){
4         System.out.println("dao--------------add");
5     }
6 }

 

@Service(value="userservice")
public class UserService {
    //得到dao对象
    //1定义dao类型属性
    //在dao属性上面使用注解完成对象注入 autowired代表自动装配/注入,注意这里的private UserDao userdao自动注入是根据类名注入的,和UserDao里面的注入对象没有任何关系
    @Autowired
    private UserDao userdao;
    //使用注解方式不需要set方法
    public void add(){
        System.out.println("service------------add");
        userdao.add();
    }
}

 

1 @Test
2     public void testService(){
3         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
4         UserService userService = (UserService)applicationContext.getBean("userservice");
5         userService.add();
6     }

 

第二种注解(经常用,因为能够准确注入)@Resource:

 

 

 1 @Service(value="userservice")
 2 public class UserService {
 3     //得到dao对象
 4     //1定义dao类型属性
 5     //2在dao属性上面使用注解完成对象注入 autowired代表自动装配
 6     //@Autowired
 7     //name属性值写注解创建的dao对象value值
 8     @Resource(name="userdao")
 9     private UserDao userdao;
10     //使用注解方式不需要set方法
11     public void add(){
12         System.out.println("service------------add");
13         userdao.add();
14     }
15 }

 

 

三、xml和注解方式混合使用

 

1、创建对象的操作使用配置文件方式实现;

 

1 public class BookDao {
2     public void book(){
3         System.out.println("book dao-----------");
4     }
5 }

 

 

1 public class OrderDao {
2     public void order(){
3         System.out.println("order dao-----------");
4     }
5 }

 

 1 public class BookService {
 2     //得到bookdao和orderdao对象
 3     @Resource(name="bookDao")
 4     private BookDao bookdao;
 5     @Resource(name="orderDao")
 6     private OrderDao orderdao;
 7     
 8     public void add(){
 9         System.out.println("bookservice");
10         bookdao.book();
11         orderdao.order();
12     }
13 }

配置文件

1 <!-- 配置对象 -->
2     <bean id="bookService" class="com.xmlanno.BookService"></bean>
3     <bean id="bookDao" class="com.xmlanno.BookDao"></bean>
4     <bean id="orderDao" class="com.xmlanno.OrderDao"></bean>

 

2、注入属性的操作使用注解实现

 

1 //得到bookdao和orderdao对象
2     @Resource(name="bookDao")
3     private BookDao bookdao;
4     @Resource(name="orderDao")
5     private OrderDao orderdao;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文由19463331韦德国际发布于韦德国际1946手机版,转载请注明出处:springboot~Compiler时开启插件的批注成效