我正在使用spring boot,在Controller中,我试图使用new operator创建一个对象,并试图打印对象的值,但对于仓库我使用了@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);
}
这是一个服务类,我在其中自动连接了 "UserRepository userrepo;"。
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管理的组件。
添加 @Service
在 用户服务 类,并确保 用户资源库 有 @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会话、需要一个DataSource、需要一个JDBC连接的对象--这很快就变成了很多需要反复创建和初始化的对象。
@Autowired
Springs依赖注入在启动时的成本更高一些,因为容器必须被初始化,所有的管理对象都必须被设置。然而,由于您不会为您的托管对象创建新的实例(假设您是这样设计的),您将从较少的 GC 负载和较少的对象创建中获得一些运行时性能。
范围
另一个重要的事情是,通过Spring注释,即使你可以管理 对象范围但有 new
关键字不可能(除非你做哑巴单子之类的),我相信有了新的关键字你不可能有 Prototype, Request, Single
代码维护性
考虑到 100 类,使用 UserDao
类,你就会得到这样的道实例。private UserDao userDao = new UserDaoImpl();
在100个地方。现在考虑一个需求改变了,我们需要使用 SomeOtherUserDao
作为 class LdapUserDao implements UserDao
,我们将如何处理新的关键词,我们将 impl 类绑定到用法中。