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

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


Блог

Главная » 2014 » Апрель » 29 » Инжекция зависимостей в JSF
17:58
Инжекция зависимостей в JSF

Инжекция зависимостей в JSF (Contexts and Dependency Injection) или CDI позволяет нам включать в управляемые бины другие управляемые бины без необходимости создавать объекты в ручную, то есть вызывать конструктор. Создание объекта ложится на плечи контейнера, нам лишь нужно правильно указывать скопы бинов.

Вариант устаревший:

package main;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

/**
 *
 * @author martyshov
 */
@ManagedBean(name="mymessage")
@RequestScoped
public class TestMessage {

 /**
 * Creates a new instance of TestMessage
 */
 public TestMessage() {
 this.amsg = "Тестируем инжекцию зависимостей - старый вариант";
 }
 
 private String amsg;

 public String getAmsg() {
 return amsg;
 }

 public void setAmsg(String amsg) {
 this.amsg = amsg;
 }
 
}

При инжекции главное правильно прописать имя инжектируемого бина: @ManagedProperty(value="#{mymessage}") и обязательно указать метод сеттер для точки инженкции public void setTm(TestMessage tm)

package main;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

/**
 *
 * @author martyshov
 */
@ManagedBean
@RequestScoped
public class MainBean {

 /**
 * Creates a new instance of MainBean
 */
 public MainBean() {
 }
 
 @ManagedProperty(value="#{mymessage}")
 private TestMessage tm;

 public void setTm(TestMessage tm) {
 this.tm = tm;
 }
 
 public String getNewMessage(){
 return tm.getAmsg();
 }
 
}

Новый вариант инжекции зависимостей:

package main;


import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

/**
 *
 * @author martyshov
 */
@Named
@RequestScoped
public class TestMessage2 {

 /**
 * Creates a new instance of TestMessage2
 */
 public TestMessage2() {
 }
 
 private String msg = "Тестируем инжекцию зависимостей - новый вариант";

 public String getMsg() {
 return msg;
 }

 public void setMsg(String msg) {
 this.msg = msg;
 }
 
}

Здесь исползуем новую аннотацию @Named и скоуп из новых пакетов

package main;

import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;

/**
 *
 * @author martyshov
 */
@Named
@RequestScoped
public class MainBean2 {

 /**
 * Creates a new instance of MainBean2
 */
 public MainBean2() {
 }
 
 @Inject
 private TestMessage2 tm;
 
 public String getWriteMessageFromCDI(){
 return tm.getMsg();
 }
 
}

Здесь мы должны использовать аннотацию @Inject для инжекции. Сеттер указывать не нужно.  Вызов методов бинов, которые в свою очередь переадресуют вызов бинам, которые были инжектированы будут в фейслете выглядеть так:




 
 Facelet Title
 
 
 #{mainBean.newMessage}
 
#{mainBean2.writeMessageFromCDI}

Кстати, в NetBeans при использовании второго варианта инжекции слева на поле в месте точки инжекции устанавливается синий кружочек (Injection Poin), что удобно при отладке.

Категория: JSF + PrimeFaces | Просмотров: 1035 | Добавил: 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  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
282930
Архив записей