Java @自动连线的结果为空
我正在使用spring boot,在Controller中,我尝试使用new操作符创建一个对象,并尝试打印其工作的对象值。但对于存储库,我使用了@Autowired,但结果为nullJava @自动连线的结果为空,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
@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();