@Autowired is resulted as null



我正在使用 spring boot,在控制器中,我尝试使用 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);
}

这是服务类,其中我自动连接了"用户存储库用户存储库;">

public class UserService {
@Autowired
UserRepository userrepo;
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;
}

@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;
}
}

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

UserServiceclass 中添加@Service,并确保UserRepository具有@Repository。或

@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository= userRepository;
}
//your code
}

新品和@Autowired品之间的区别

@Autowired private UserDao userdao;
private UserDao userDao = new UserDaoImpl();

性能

new

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

考虑这样一种情况:UserDaoImpl在多个地方实现,需要休眠会话,需要数据源,需要JDBC连接 - 它很快就会变成许多必须一遍又一遍创建和初始化的对象。

@Autowired

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

范围

另一个重要的事情是使用 spring 注释,即使你可以管理对象范围,但使用new关键字没有办法(除非你做愚蠢的单例或类似的事情(,我相信使用一个新关键字你不能有Prototype, Request, Single

代码维护

考虑100个使用该类UserDao类的类,你会得到这样的 dao 实例:private UserDao userDao = new UserDaoImpl();100 个地方。现在考虑一个需求发生了变化,我们需要使用SomeOtherUserDao作为class LdapUserDao implements UserDao,我们将如何处理新的关键字,我们将 impl 类绑定到使用中。

最新更新