@自动连线的结果是空的[重复]。

问题描述 投票:0回答:2

我正在使用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;
    }
java spring spring-boot annotations autowired
2个回答
1
投票

添加 @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管理的组件。


0
投票

添加 @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 类绑定到用法中。

© www.soinside.com 2019 - 2024. All rights reserved.