Java 如何在SpringMVC中实现DI。?
我对SpringMVC中的依赖注入感到困惑 第一个代码:-Java 如何在SpringMVC中实现DI。?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我对SpringMVC中的依赖注入感到困惑 第一个代码:- @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private Userdao udo; @Override @Transactional public List<Positions> plist() { return udo.pli
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private Userdao udo;
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线
私有用户到udo;
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
它工作得很好。
我想在这个类中实现依赖注入。我做得对还是错
第二个代码:-
`@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private Userdao udo;
public UserServiceImpl(Userdao udo) {
this.udo = udo;
}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
`@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线
私有用户到udo;
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
它不工作。错误:org.springframework.web.context.ContextLoader-上下文初始化失败
org.springframework.beans.factory.BeanCreationException:创建名为“homeController”的bean时出错:自动连线依赖项的注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动连线字段:com.xxx.Services.UserService com.xxx.java.HomeController.uservice;嵌套异常为org.springframework.beans.factory.beancreatitionException:创建名为“userServiceImpl”的bean时出错,该名称在文件[D:\xxxWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\abcd\WEB-INF\classes\com\xxx\ServiceImp\userServiceImpl.class]中定义:bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[com.xxx.ServiceImp.UserServiceImpl]:未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException:com.xxx.ServiceImp.UserServiceImpl。()
我是一个初学者。请帮我解决这个问题。如何在Spring MVC中实现DI。您可以用两种方法来实现
可以使用基于字段的自动布线。但在这种情况下,您将需要一个默认构造函数
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired // field based DI
private Userdao udo;
// default constructor
public UserServiceImpl() {}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线//基于字段的DI
私有用户到udo;
//默认构造函数
公共UserServiceImpl(){}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
您可以使用基于构造函数的依赖项注入。为此,只需将@Autowire注释移动到构造函数中即可。并将其从现场移除
@Service
@Transactional
public class UserServiceImpl implements UserService {
private Userdao udo;
@Autowired // constructor based DI
public UserServiceImpl(Userdao udo) {
this.udo = udo;
}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
私有用户到udo;
@自动连线//基于构造函数的DI
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
你可以用两种方法来做
可以使用基于字段的自动布线。但在这种情况下,您将需要一个默认构造函数
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired // field based DI
private Userdao udo;
// default constructor
public UserServiceImpl() {}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
@自动连线//基于字段的DI
私有用户到udo;
//默认构造函数
公共UserServiceImpl(){}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
您可以使用基于构造函数的依赖项注入。为此,只需将@Autowire注释移动到构造函数中即可。并将其从现场移除
@Service
@Transactional
public class UserServiceImpl implements UserService {
private Userdao udo;
@Autowired // constructor based DI
public UserServiceImpl(Userdao udo) {
this.udo = udo;
}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
私有用户到udo;
@自动连线//基于构造函数的DI
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
第一次安装是好的,应该可以工作
在第二个设置中,您会遇到以下异常
class [com.xxx.ServiceImp.UserServiceImpl]: No default constructor found;
也就是说,因为您已经定义了一个构造函数public userserviceinpl(Userdao udo)
Spring找不到无参数构造函数
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired // field based DI
private Userdao udo;
// default constructor
public UserServiceImpl() {}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
您可以删除此构造函数并使用第一个构造函数,也可以自己定义无参数构造函数
实际上,您不需要在bean中定义构造函数,因为您自己不打算创建bean对象。只有在自动连接构造函数参数时才需要它
如果您正在尝试自动连接构造函数,那么您可以像下面这样做
@Service
@Transactional
public class UserServiceImpl implements UserService {
private Userdao udo;
@Autowired //autowired constructor, instead of the field
public UserServiceImpl(Userdao udo) {
this.udo = udo;
}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
私有用户到udo;
@Autowired//Autowired构造函数,而不是字段
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
第一次安装没问题,应该可以正常工作
在第二个设置中,您会遇到以下异常
class [com.xxx.ServiceImp.UserServiceImpl]: No default constructor found;
也就是说,因为您已经定义了一个构造函数public userserviceinpl(Userdao udo)
Spring找不到无参数构造函数
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired // field based DI
private Userdao udo;
// default constructor
public UserServiceImpl() {}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
您可以删除此构造函数并使用第一个构造函数,也可以自己定义无参数构造函数
实际上,您不需要在bean中定义构造函数,因为您自己不打算创建bean对象。只有在自动连接构造函数参数时才需要它
如果您正在尝试自动连接构造函数,那么您可以像下面这样做
@Service
@Transactional
public class UserServiceImpl implements UserService {
private Userdao udo;
@Autowired //autowired constructor, instead of the field
public UserServiceImpl(Userdao udo) {
this.udo = udo;
}
@Override
@Transactional
public List<Positions> plist() {
return udo.plist();
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
私有用户到udo;
@Autowired//Autowired构造函数,而不是字段
公共UserServiceImpl(Userdao udo){
this.udo=udo;
}
@凌驾
@交易的
公共列表plist(){
返回udo.plist();
}
}
简单地说:如果定义构造函数(重载),则必须在构造函数上使用@Autowired
注释;如果未定义构造函数,则必须使用@Autowired
注释