Приветствую Вас ГостьВторник, 14.05.2024, 08:06

Программирование на Java, Android, Delphi


Блог

Главная » 2014 » Май » 6 » Инжектирование неуправляемых объектов producer методом
11:32
Инжектирование неуправляемых объектов producer методом

Мы можем инжектировать не только управляемые контейнером объекты, но и любые простые объекты. Для этого инжектированное поле или метод помечается аннотацией @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();
 }
 
 
}
Категория: JSF + PrimeFaces | Просмотров: 753 | Добавил: alex | Рейтинг: 5.0/1
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Май 2014  »
ПнВтСрЧтПтСбВс
   1234
567891011
12131415161718
19202122232425
262728293031
Архив записей