Мы можем инжектировать не только управляемые контейнером объекты, но и любые простые объекты. Для этого инжектированное поле или метод помечается аннотацией @Produces и каким-либо собственным квалификатором. Далее этот квалификатор используется для инжектирования объекта. Объект может быть любым - строка, целое или объект пользовательского типа. Пример:
Объявим простой класс, который будем инжектировать:
package main;
/**
*
* @author martyshov
*/
public class TestClass {
private String msg;
public TestClass() {
this.msg = "Это простой класс который был инжектирован";
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
Далее определим квалификаторы. Их несколько, так как примеров будет несколько:
package main;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
*
* @author martyshov
*/
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface TestClassQ {
}
package main;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
*
* @author martyshov
*/
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface Random {
}
package main;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
/**
*
* @author martyshov
*/
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface MyMaxNumber {
}
Далее объявим бин в котором будут объект целого типа и случайное число
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.Produces;
/**
*
* @author martyshov
*/
@Named
@Dependent
@Default
public class MessageImpl3 implements Message {
/**
* Creates a new instance of MessageImpl3
*/
public MessageImpl3() {
this.tc = new TestClass();
}
@Override
public String getMessage() {
return "Имплементация по умолчанию";
}
private int IntValue = 777;
private int maxNumber = 100;
@Produces
@MyMaxNumber
int getMyNumber() {
return IntValue;
}
private java.util.Random random
= new java.util.Random(System.currentTimeMillis());
java.util.Random getRandom() {
return random;
}
@Produces
@Random
int next() {
return getRandom().nextInt(maxNumber);
}
@Produces
@TestClassQ
TestClass tc;
}
Теперь покажем как инжектировать пользовательский объект и целое число:
package main;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
/**
*
* @author martyshov
*/
@Named
@RequestScoped
public class MainBean {
/**
* Creates a new instance of MainBean
*/
public MainBean() {
}
@Inject
// @ImplTwo
private Message msg;
public String getMessage(){
return msg.getMessage();
}
@Inject @MyMaxNumber private int InjectValue;
public int getInjectValue(){
return InjectValue;
}
@Inject @Random private Instance randomInt;
public int getRandomInt() {
return randomInt.get();
}
@Inject @TestClassQ private Instance tc;
public String getTestClassData(){
return tc.get().getMsg();
}
@Inject @TestClassQ private TestClass tc2;
public String getTestClassData2(){
return tc2.getMsg();
}
}
|