스프링 JSF 통합: 스프링 구성 요소/서비스를 JSF 관리 빈에 주입하는 방법은 무엇입니까?
View 계층을 모델과 "연결"하는 것이 유일한 작업이기 때문에 관리되는 빈이 컨트롤러처럼 작동하는 것으로 알고 있습니다.
관리되는 콩으로 콩을 사용하려면 선언해야 합니다.@ManagedBean
주석, 그렇게 함으로써 나는 콩과 JSF를 직접 소통할 수 있습니다.
이 관리되는 Bean에 (Spring에서) 일부 성분을 주입하려면 두 가지 방법이 있습니다.
ManagedBean에서예: " DAO dao하고 ManagedBean을 합니다.
@ManagedProperty(#{"basicDAO"})
재산 이상의하면서, 콩을 주사하고 있습니다."basicDAO"
봄부터 시작합니다.Class에서 다음 Managed Bean Class를 합니다. @Controller 나서, 는
@ManagedBean
그리고.@Controller
주석, 모두 함께.그리고 부동산에서."BasicDAO dao"
나는 사용해야 합니다.@Autowired
제가 이해한 것이 맞습니까?
@ManagedBean
대@Controller
무엇보다도, 여러분은 여러분의 콩을 관리하기 위해 하나의 틀을 선택해야 합니다.콩을 관리하려면 JSF 또는 Spring(또는 CDI)을 선택해야 합니다.다음은 작동하지만 근본적으로 잘못된 것입니다.
@ManagedBean // JSF-managed.
@Controller // Spring-managed.
public class BadBean {}
JSF가 관리하는 것과 Spring이 관리하는 것과 같은 관리되는 빈 클래스의 완전히 별개의 인스턴스 두 개가 생성됩니다.당신이 그것을 참조할 때 EL에서 실제로 어떤 것이 사용될지는 직접적으로 명확하지 않습니다.#{someBean}
에 등록된 경우faces-config.xml
JSF가 관리하는 것이 아니라 스프링이 관리하는 것입니다.만약 당신이 그것을 가지고 있지 않다면, 그것은 JSF가 관리하는 것일 것입니다.
범위로 : "JSF 관리 범위"), 예: "JSF 관리 범위는 다음과 같습니다.@RequestScoped
,@ViewScoped
,@SessionScoped
또는@ApplicationScoped
javax.faces.*
패키지, 그것은 오직 인식되고 사용될 것입니다.@ManagedBean
그것은 에 의해 이해되지 않을 것입니다.@Controller
은 자기 자신의 을 기대하고 에.@Scope
◦시 범위으로 기본 됩니다.부재 시 기본적으로 싱글톤(응용프로그램 범위)으로 설정됩니다.
@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
@Controller // Spring-managed (without own scope, so actually becomes a singleton).
public class BadBean {}
을 의위콩참할때는조을때▁the▁via는▁you로 참조할 때#{someBean}
JSF 관리 보기 범위 빈이 아니라 Spring 관리 응용 프로그램 범위 빈을 반환합니다.
@ManagedProperty
대@Autowired
에 특화된 JSF.@ManagedProperty
콩에서만 JSF를 .@ManagedBean
에 특화된 집@Autowired
에서만 작동합니다. Spring . 용인, 중우콩에경우,▁works▁spring중.@Controller
아래의 접근 방식은 더 작거나 더 동등하며 혼합할 수 없습니다.
@ManagedBean // JSF-managed.
@RequestScoped // JSF-managed scope.
public class GoodBean {
@ManagedProperty("#{springBeanName}")
private SpringBeanClass springBeanName; // Setter required.
}
@Component // Spring-managed.
@Scope("request") // Spring-managed scope.
public class GoodBean {
@Autowired
private SpringBeanClass springBeanName; // No setter required.
}
에 등록된 경우 주의하십시오.faces-config.xml
자바독에 따르면,
<application>
...
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
그래서 당신은 EL을 통해 봄에 관리되는 콩을 참조할 수 있습니다.#{springBeanName}
그러면 당신은 그냥 그것들을 참조할 수 있습니다.@ManagedProperty
또한 기본적으로 주어진 EL 식의 평가 결과를 설정하기 때문입니다. 주입하는 은 JSF 관리 콩입니다.@Autowired
지원되지 않습니다.그러나 사용할 수 있습니다.@Autowired
당신이 당신의 콩을 연장할 때 JSF 관리 콩에서.생성자 호출 중에 JSF 관리 bean 인스턴스가 Spring autowable 컨텍스트에 자동으로 등록됩니다. 이는 모든 것을 의미합니다.@Autowired
에서 사수있다에서 이용할 수 .@PostConstruct
나중에.
@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean extends SpringBeanAutowiringSupport implements Serializable {
@Autowired
private SpringBeanClass springBeanName; // No setter required.
@PostConstruct
private void init() {
// springBeanName is now available.
}
}
또는 아키텍처에서 다른 기본 클래스의 빈 확장을 허용하지 않는 경우 아래와 같이 JSF 관리 빈 인스턴스를 항상 수동으로 Spring autowable 컨텍스트에 등록할 수 있습니다.자세한 내용은 JSF 2와 스프링 3(또는 스프링 4)을 적절히 통합하는 방법을 참조하십시오.
@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean implements Serializable {
@Autowired
private SpringBeanClass springBeanName; // No setter required.
@PostConstruct
private void init() {
FacesContextUtils
.getRequiredWebApplicationContext(FacesContext.getCurrentInstance())
.getAutowireCapableBeanFactory().autowireBean(this);
// springBeanName is now available.
}
}
@XxxScoped
대@Scope
@Scope
에는 JSF 범위에 대한 지원이 제한되어 있습니다.JSF에 하는 것은 @ViewScoped
기본적으로 자체 스코프를 홈 확장하거나 위와 같이 JSF 관리 Bean 인스턴스를 Spring autowable 컨텍스트에 수동으로 등록합니다.
는 JSF 에서 새로운 WebFlow를 되었습니다.@FlowScoped
2가 없습니다따라서 이미 JSF 2.2를 사용하고 있다면 흐름 범위만 원한다면 Spring WebFlow를 사용할 필요가 없습니다.
CDI - 모든 것을 통합하려고 합니다.
Java EE 6 이후, CDI는 Spring DI의 표준 대안으로 제공됩니다.그것은 각각 가지고 있습니다.@Named
그리고.@Inject
이에 대한 주석 및 고유한 범위 집합.Spring을하지 않기 잘 , 스링을사않때스기문어프만지모잘프하겠르는는지,@Inject
것.@ManagedBean
,그리고.@ManagedProperty
富士山의 @ManagedBean
를 참조할 수 있습니다.@Named
로 콩. 콩. 콩. 콩.@ManagedProperty
내부에서 작동하지 않습니다.@Named
CDI의 목적은 모든 다른 콩 관리 프레임워크를 하나의 규격/인터페이스로만 통합하는 것입니다.한 CDI이 될 수 Spring CDI만 해당).javax.inject.*
는 JSR-299입니다.javax.enterprise.context.*
Spring에서 CDI를 지원합니까? 및 이 자습서를 참조하십시오.
는 콩 이며 JSF를 할 것입니다.@ManagedBean
그리고 미래 버전의 친구들.
@Named // CDI-managed.
@ViewScoped // CDI-managed scope.
public class BetterBean implements Serializable {
@Inject
private SpringBeanClass springBeanName; // No setter required.
@PostConstruct
private void init() {
// springBeanName is now available.
}
}
참고 항목:
- Spring 또는 EJB3 또는 이들 모두를 함께 사용하는 것이 필요하거나 편리한 경우는 언제입니까?
- JSF 서비스 계층
- 백킹 빈(@Managed Bean) 또는 CDI 빈(@Named)?
- JSF를 Spring MVC의 뷰 기술로 활용
- Tomcat에 CDI를 설치하고 사용하는 방법은 무엇입니까?
을 JSF 에서 확장하는 만으로 JSF 에서 봄 .SpringBeanAutowiringSupport
스프링이 의존성 주입을 처리할 겁니다
@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean extends SpringBeanAutowiringSupport {
@Autowired
private SpringBeanClass springBeanName; // No setter required.
// springBeanName is now available.
}
이 가장 입니다. 는 XML을 사용했습니다.@Component
이지만 jsf managed bean입니다.@Autowired
관리되는 빈이 faces-config.xml에 이미 있기 때문에 작동하지 않았습니다.관리되는 빈 정의를 xml 파일에 관리되는 속성과 함께 유지해야 하는 경우 관리되는 빈 태그 내의 다른 관리되는 속성으로 스프링 빈을 추가하는 것이 좋습니다.여기서 스프링 빈은 spring-config.xml에 정의되어 있습니다(대체로 어딘가에서 자동 배선될 수 있음).https://stackoverflow.com/a/19904591/5620851 을 참조하십시오.
제가 편집했습니다.주석 @Managed 및 @Component를 통해 모두 구현하거나 둘 다 xml을 통해 구현하는 것이 좋습니다.
개별 콩을 자동 배선할 수 있습니다.@Autowired
를 getBean
현재 웹 응용 프로그램 컨텍스트입니다.
자세한 내용은 @BalusC의 답변을 참조하시기 바랍니다.이것은 그의 예에 대한 약간의 수정일 뿐입니다.
@ManagedBean // JSF-managed.
@ViewScoped // JSF-managed scope.
public class GoodBean implements Serializable {
// @Autowired // No Autowired required
private SpringBeanClass springBeanName; // No setter required.
@PostConstruct
private void init() {
WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
this.springBeanName = ctx.getBean(SpringBeanClass.class);
// springBeanName is now available.
}
}
언급URL : https://stackoverflow.com/questions/18387993/spring-jsf-integration-how-to-inject-a-spring-component-service-in-jsf-managed
'sourcecode' 카테고리의 다른 글
특정 범위의 Excel 셀을 한 워크시트에서 다른 워크시트로 복사 (0) | 2023.08.22 |
---|---|
경로 변경 시 모든 Axios 요청 중단 vue-router 사용 (0) | 2023.08.17 |
Google Chrome devtools의 교차 스타일 속성은 무엇을 의미합니까? (0) | 2023.08.17 |
아이폰 방향을 설정하는 문서화된 방법이 있습니까? (0) | 2023.08.17 |
MacOS에서 도커를 쉽게 설치 및 제거하는 방법 (0) | 2023.08.17 |