Java @自动连线的结果为空

Java @自动连线的结果为空,java,spring,spring-boot,annotations,autowired,Java,Spring,Spring Boot,Annotations,Autowired,我正在使用spring boot,在Controller中,我尝试使用new操作符创建一个对象,并尝试打印其工作的对象值。但对于存储库,我使用了@Autowired,但结果为null @RestController public class SignupController { //@Autowired UserService userservice =new UserService() ; @GetMapping("/Allusers") public Res

我正在使用spring boot,在Controller中,我尝试使用new操作符创建一个对象,并尝试打印其工作的对象值。但对于存储库,我使用了@Autowired,但结果为null

@RestController
public class SignupController {
    //@Autowired
    UserService userservice =new UserService() ;

    @GetMapping("/Allusers")
    public ResponseEntity<List<User>> allUsers() {
        System.out.print(userservice+"\n");
        List<User> userlist = userservice.getAllUsers();
        if (userlist.isEmpty()) {

            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }

        return new ResponseEntity<>(userlist, HttpStatus.OK);
    }
@RestController
公共类注册控制器{
//@自动连线
UserService UserService=new UserService();
@GetMapping(“/Allusers”)
公众反应诱惑者(){
System.out.print(userservice+“\n”);
List userlist=userservice.getAllUsers();
if(userlist.isEmpty()){
返回新的ResponseEntity(未找到HttpStatus.NOT_);
}
返回新的响应属性(userlist,HttpStatus.OK);
}
这是我自动连接“UserRepository userrepo;”的服务类

公共类用户服务{
@自动连线
userrepo;
公共列表getAllUsers(){
List userlist=new ArrayList();
System.out.println(userrepo);
forEach(users->userlist.add(users));
System.out.println(“hii”);
返回用户列表;
}

@Service
注释添加到
UserService
类中,并将构造函数添加到同一类中。如下所示

@Service
public class UserService {

    private final UserRepository userrepo;

    public UserService(UserRepository userRepository) {
        this.userrepo = userRepository;
    }

    public List<User> getAllUsers() {
        List<User> userlist = new ArrayList<User>();
        System.out.println(userrepo);
        userrepo.findAll().forEach(users -> userlist.add(users));
        System.out.println("hii");
        return userlist;
    }
}
@服务
公共类用户服务{
私有最终用户存储库userrepo;
公共用户服务(用户存储库用户存储库){
this.userrepo=userRepository;
}
公共列表getAllUsers(){
List userlist=new ArrayList();
System.out.println(userrepo);
forEach(users->userlist.add(users));
System.out.println(“hii”);
返回用户列表;
}
}

如果要使用
@Autowired
注释,请确保
UserRepository
类使用
@Service
@Controller
@Component
注释。这是必需的,因为我们需要说该对象是Spring管理的组件。

在UserService类和mak中添加
@Service
e确保UserRepository具有
@Repository
。或

    @Service
    public class UserService {

        private final UserRepository userRepository;

        public UserService(UserRepository userRepository) {
            this.userRepository= userRepository;
        }

        //your code
    }

新建和自动连线之间的差异

@Autowired private UserDao userdao;

private UserDao userDao = new UserDaoImpl();
性能

new

使用新方法,您每次都会得到一个新对象,无论您是想还是不想。即使
UserDaoImpl
是可重用的、无状态的和线程安全的(DAO类应该努力做到这一点),您仍然会在每个需要它们的地方创建它们的新实例

考虑一种情况,
UserDaoImpl
已经在多个地方实现,这需要一个Hibernate会话,需要一个数据源,需要一个JDBC连接——它很快就变成了许多必须反复创建和初始化的对象

@Autowired

Springs依赖项注入在启动时的成本稍高一些,因为必须初始化容器并设置所有托管对象。但是,由于您不会创建托管对象的新实例(假设这就是您设计它们的方式),您将从较少的GC负载和较少的对象创建中获得一些运行时性能

范围

另一件重要的事情是使用spring注释,即使您可以管理对象范围,但使用
new
关键字也不行(除非您使用dumb singleton或类似的方法),我确信使用新关键字您不能拥有
Prototype、Request、Single

代码维护性


考虑100个使用
UserDao
class的类,得到的dao实例如下:
private-UserDao-UserDao=new-UserDaoImpl()在100个地方,现在考虑一个需求改变,我们需要使用<代码> SomeOtherUserDao <代码>作为代码>类LDAPUSEDAO实现UsRoAd/<代码>,我们将如何处理新的关键字,我们将IMPL类绑定到使用中。< /P>在代码> UService < /Cuff>类中添加<代码> @服务< /代码>,并确保<代码> UserRepository < /代码>具有<代码> @ RePiTe]。tory
注释并尝试againit已经存在于程序中,当我在控制器类中使用@autowired时,它工作正常,但当我使用new运算符创建对象时,它为空。不需要使用
new
关键字创建对象,使用
@autowired
是依赖项注入的一个好方法。我正在找出@Autowire之间的区别d和新操作员
@Autowired private UserDao userdao;

private UserDao userDao = new UserDaoImpl();