Y**G 发帖数: 1089 | 1 假定我自己定义了一个qualifier: Year用来描述汽车制造的年份
@Qualifier
public @interface Year {
int value();
}
如果我需要2010年生产的汽车,我可以用
...
@Autowired
@Year(2010)
private Car car;
...
我怎么可以表达“我要2010年以后生产的汽车”?
下面的写法不工作:
...
@Autowired
@Year(value>2010)
private Car car;
... |
Y**G 发帖数: 1089 | 2 我的前提条件是容器的配置是正确的,2010以后的汽车只有一辆,不会没有。autowire
不会出现问题。 |
z****e 发帖数: 54598 | 3 等下,spring允许你自己写annotation了?
你用spring的话,应该用不到@interface吧? |
o****e 发帖数: 44 | |
o****e 发帖数: 44 | 5 yes, you can create a custom qualifier annotation, all you need to do is to
define an annotation that’s itself annotated with @Qualifier.
【在 z****e 的大作中提到】 : 等下,spring允许你自己写annotation了? : 你用spring的话,应该用不到@interface吧?
|
o****e 发帖数: 44 | 6 要实现lz的想法办法有几个。没那么复杂,lz想多了。
这跟spring真没关系。lz你的year interface只有一个int 变量,你给“value>2010”
这个进去,算啥?必须是int才行啊。
你这个写法,就不是java了,是人类语言了。lol。
直接写多一个annotation最简单,
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface NewerThanYearTwoOTen{
}
@NewerThanYearTwoOTen
@Year(2018)
public class NewBMWBENZshittyCar implements Car{
...
}
@Autowired
@NewerThanYearTwoOTen
private Car car;
简单粗暴。bingo, you get a NewBMWBENZshittyCar.
或者用你的办法,就得这样。跟spring没关系了。
if (obj.isAnnotationPresent(year.class)) {
Annotation annotation = obj.getAnnotation(Year.class);
Year year = (Year) annotation;
if(year.value > 2010){
//do whatever you want here;
}
} |
o****e 发帖数: 44 | 7 马来个鸡蛋,我是不是闲的很蛋痛?nnd。全看pornhub算了。 |
d****i 发帖数: 4809 | 8 楼主明显想多了,这个用annotation显然是overkill了,而且由于用了reflection而使
得性能下降。最简单粗暴的就是把year放到Car里面, 这样既符合面向对象的基本原则
,又不会因为滥用annotation和反射而导致性能下降:
public class Car {
private int year;
public boolean isGreaterThanGivenYear(int given) {
return year > given ? true : false;
}
//other methods.....
} |
Y**G 发帖数: 1089 | 9 把Year放到Car里面去,那怎么用autowired呢? |
Y**G 发帖数: 1089 | 10 假定我自己定义了一个qualifier: Year用来描述汽车制造的年份
@Qualifier
public @interface Year {
int value();
}
如果我需要2010年生产的汽车,我可以用
...
@Autowired
@Year(2010)
private Car car;
...
我怎么可以表达“我要2010年以后生产的汽车”?
下面的写法不工作:
...
@Autowired
@Year(value>2010)
private Car car;
... |
|
|
Y**G 发帖数: 1089 | 11 我的前提条件是容器的配置是正确的,2010以后的汽车只有一辆,不会没有。autowire
不会出现问题。 |
z****e 发帖数: 54598 | 12 等下,spring允许你自己写annotation了?
你用spring的话,应该用不到@interface吧? |
o****e 发帖数: 44 | |
o****e 发帖数: 44 | 14 yes, you can create a custom qualifier annotation, all you need to do is to
define an annotation that’s itself annotated with @Qualifier.
【在 z****e 的大作中提到】 : 等下,spring允许你自己写annotation了? : 你用spring的话,应该用不到@interface吧?
|
o****e 发帖数: 44 | 15 要实现lz的想法办法有几个。没那么复杂,lz想多了。
这跟spring真没关系。lz你的year interface只有一个int 变量,你给“value>2010”
这个进去,算啥?必须是int才行啊。
你这个写法,就不是java了,是人类语言了。lol。
直接写多一个annotation最简单,
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface NewerThanYearTwoOTen{
}
@NewerThanYearTwoOTen
@Year(2018)
public class NewBMWBENZshittyCar implements Car{
...
}
@Autowired
@NewerThanYearTwoOTen
private Car car;
简单粗暴。bingo, you get a NewBMWBENZshittyCar.
或者用你的办法,就得这样。跟spring没关系了。
if (obj.isAnnotationPresent(year.class)) {
Annotation annotation = obj.getAnnotation(Year.class);
Year year = (Year) annotation;
if(year.value > 2010){
//do whatever you want here;
}
} |
o****e 发帖数: 44 | 16 马来个鸡蛋,我是不是闲的很蛋痛?nnd。全看pornhub算了。 |
d****i 发帖数: 4809 | 17 楼主明显想多了,这个用annotation显然是overkill了,而且由于用了reflection而使
得性能下降。最简单粗暴的就是把year放到Car里面, 这样既符合面向对象的基本原则
,又不会因为滥用annotation和反射而导致性能下降:
public class Car {
private int year;
public boolean isGreaterThanGivenYear(int given) {
return year > given ? true : false;
}
//other methods.....
} |
Y**G 发帖数: 1089 | 18 把Year放到Car里面去,那怎么用autowired呢? |
h*********8 发帖数: 404 | |