@Autowired 结果为 null
@Autowired is resulted as null
我正在使用 spring 启动,在 Controller 中,我尝试使用 new 运算符创建一个对象,并尝试打印其 working.but 的对象值用于我使用 @Autowired 的存储库,但导致空
@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);
}
这是服务 class,我在其中自动连接 "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
class 并将构造函数添加到相同的 class。如下图所示;
@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
class 被注释为 @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
}
new和@Autowired的区别
@Autowired private UserDao userdao;
private UserDao userDao = new UserDaoImpl();
性能
new
使用 new 方法,您每次都会得到一个新对象,无论您想要还是不。即使 UserDaoImpl
是 可重用、无状态和线程安全的 (DAO classes 应该努力成为)你仍然会在它们所在的每个地方创建它们的新实例需要。
考虑这样一种情况,其中 UserDaoImpl
在多个地方实施,需要 Hibernate 会话,需要数据源,需要 JDBC 连接 - 它很快变成很多对象一遍又一遍地创建和初始化。
@Autowired
Springs 依赖注入在启动时花费更多,因为必须初始化容器并设置所有托管对象。但是,由于您不会创建托管对象的新实例(假设您是这样设计它们的),您将从更少的 GC 负载和更少的对象创建中获得一些运行时性能。
范围
另一个重要的事情是使用 spring 注释即使你可以管理 对象范围 ,但是使用 new
关键字没办法(除非你做愚蠢的单例或类似的东西),我敢肯定你不能使用新关键字 Prototype, Request, Single
代码维护
考虑使用UserDao
class的100classes,然后你得到这样的dao实例:private UserDao userDao = new UserDaoImpl();
在100 个名额。现在考虑更改需求,我们需要将 SomeOtherUserDao
用作 class LdapUserDao implements UserDao
,我们将如何处理新关键字,我们将 impl class 绑定到用法中。
我正在使用 spring 启动,在 Controller 中,我尝试使用 new 运算符创建一个对象,并尝试打印其 working.but 的对象值用于我使用 @Autowired 的存储库,但导致空
@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);
}
这是服务 class,我在其中自动连接 "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
class 并将构造函数添加到相同的 class。如下图所示;
@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
class 被注释为 @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
}
new和@Autowired的区别
@Autowired private UserDao userdao;
private UserDao userDao = new UserDaoImpl();
性能
new
使用 new 方法,您每次都会得到一个新对象,无论您想要还是不。即使 UserDaoImpl
是 可重用、无状态和线程安全的 (DAO classes 应该努力成为)你仍然会在它们所在的每个地方创建它们的新实例需要。
考虑这样一种情况,其中 UserDaoImpl
在多个地方实施,需要 Hibernate 会话,需要数据源,需要 JDBC 连接 - 它很快变成很多对象一遍又一遍地创建和初始化。
@Autowired
Springs 依赖注入在启动时花费更多,因为必须初始化容器并设置所有托管对象。但是,由于您不会创建托管对象的新实例(假设您是这样设计它们的),您将从更少的 GC 负载和更少的对象创建中获得一些运行时性能。
范围
另一个重要的事情是使用 spring 注释即使你可以管理 对象范围 ,但是使用 new
关键字没办法(除非你做愚蠢的单例或类似的东西),我敢肯定你不能使用新关键字 Prototype, Request, Single
代码维护
考虑使用UserDao
class的100classes,然后你得到这样的dao实例:private UserDao userDao = new UserDaoImpl();
在100 个名额。现在考虑更改需求,我们需要将 SomeOtherUserDao
用作 class LdapUserDao implements UserDao
,我们将如何处理新关键字,我们将 impl class 绑定到用法中。