@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

代码维护

考虑使用UserDaoclass的100classes,然后你得到这样的dao实例:private UserDao userDao = new UserDaoImpl();在100 个名额。现在考虑更改需求,我们需要将 SomeOtherUserDao 用作 class LdapUserDao implements UserDao,我们将如何处理新关键字,我们将 impl class 绑定到用法中。