【问题标题】:@Autowired is resulted as null [duplicate]@Autowired 结果为 null [重复]
【发布时间】:2020-05-23 05:28:06
【问题描述】:

我正在使用 Spring Boot,在 Controller 中,我尝试使用 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);
    }

这是我在其中自动连接“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;
    }

【问题讨论】:

  • UserService 类中添加@Service 并确保UserRepository@Repository 注释并重试
  • 它已经存在于程序中,当我在控制器类中使用 @autowired 时它可以工作,但是当我使用 new 运算符创建对象时,它是 null
  • 无需使用new关键字创建对象,使用@Autowired是依赖注入的好方法
  • 我正在弄清楚 @Autowired 和 new 运算符之间的区别

标签: java spring spring-boot annotations autowired


【解决方案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 托管组件。

【讨论】:

    【解决方案2】:

    UserService 类中添加@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 类应该努力做到这一点),您仍然会在每个需要它们的地方创建它们的新实例。

    考虑UserDaoImpl在多个地方实现的情况,需要一个Hibernate会话,需要一个DataSource,需要一个JDBC连接——它很快就会变成很多对象,必须一遍又一遍地创建和初始化再次。

    @Autowired

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

    范围

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

    代码可维护性

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

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 1970-01-01
      • 2020-11-27
      • 2011-12-17
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2020-09-01
      • 2016-11-27
      相关资源
      最近更新 更多