the first test

博主在youkuaiyun.com的博客记录了C、C++和Java相关知识,聚焦于信息技术领域的编程语言知识分享。
Today i have my blog on the web of youkuaiyun.com
record some knowledge about c and c++ and Java
<think> 我们遇到了一个NullPointerException,发生在Main类的test1方法中,具体是在第30行:System.out.println(factory); 这一行。 原因是在main方法中直接创建了Main对象:Main main = new Main(); 然后调用了main.test1()。 但是,Main类中使用了Spring的依赖注入(@Autowired private PaymentStrategyFactory factory;), 而我们直接通过new Main()创建的对象并没有经过Spring容器管理,因此factory没有被自动注入,仍然是null。 解决方案: 由于我们使用了Spring,应该让Spring容器来管理Main对象,而不是直接new。 但是,main方法是静态的,它是程序的入口。通常,我们会通过Spring容器来获取Main类的bean,或者将需要执行的方法放在一个由Spring管理的bean中。 修改思路: 1. 将Main类配置为Spring组件(已经使用@Component注解,没问题)。 2. 在main方法中初始化Spring容器,然后从容器中获取Main类的bean,再调用其test1方法。 具体步骤: 创建一个Spring配置类(如果还没有的话),或者使用注解配置。 然后,在main方法中,使用AnnotationConfigApplicationContext来加载配置并启动Spring容器。 但是,注意原代码中并没有配置类。我们可以创建一个配置类,或者使用组件扫描。 例如,我们可以这样修改: 首先,创建一个配置类,比如AppConfig,并指定扫描包: @Configuration @ComponentScan(basePackages = "com.basic01") public class AppConfig { } 然后,修改main方法: public static void main(String[] args) { // 初始化Spring容器 ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 从容器中获取Main类的bean Main main = context.getBean(Main.class); main.test1(); } 这样,Main类由Spring容器创建,其依赖的factory就会被自动注入。 但是,如果不想创建配置类,也可以直接在ApplicationContext中指定扫描的包: ApplicationContext context = new AnnotationConfigApplicationContext("com.basic01"); 修改后的Main类: 注意:原Main类中使用了@Component注解,所以它会被Spring扫描到。 另外,原代码中在test1方法中调用PayContextStrategy.toPayHtml("32"),这个方法看起来是静态方法,但这里可能与问题无关,先解决NullPointerException。 修改后的代码示例: </think> 您的代码出现了 `NullPointerException`,原因是在非 Spring 管理环境中直接 `new Main()` 导致依赖注入失败。以下是详细分析和解决方案: ### 问题原因 1. **直接实例化对象**:`Main main = new Main()` 绕过了 Spring 容器,导致 `@Autowired` 注解失效 2. **未初始化 Spring 上下文**:`main()` 方法作为入口未加载 Spring 容器 3. **依赖注入失效**:`private PaymentStrategyFactory factory` 未被注入(始终为 `null`) --- ### 解决方案(二选一) #### 方案一:使用 Spring Boot 启动器(推荐) ```java @SpringBootApplication public class Main implements CommandLineRunner { @Autowired private PaymentStrategyFactory factory; public static void main(String[] args) { SpringApplication.run(Main.class, args); // 启动Spring容器 } @Override public void run(String... args) { test1(); // Spring托管后自动执行 } public void test1() { System.out.println("This is the first TestClass"); System.out.println(factory); IPayStrategy strategy = factory.getStrategy("AliPayStrategy"); System.out.println(PayContextStrategy.toPayHtml("32")); } } ``` #### 方案二:手动初始化 Spring 容器 ```java @Component public class Main { @Autowired private PaymentStrategyFactory factory; public static void main(String[] args) { // 手动创建Spring容器 ApplicationContext ctx = new AnnotationConfigApplicationContext("com.basic01"); Main main = ctx.getBean(Main.class); // 从容器获取Bean main.test1(); } public void test1() { ... } // 同方案一 } ``` ### 关键修改点 1. **添加启动注解**:`@SpringBootApplication` + `CommandLineRunner` 2. **移除直接实例化**:通过 `SpringApplication.run()` 或 `ApplicationContext` 获取 Bean 3. **确保包路径正确**:Spring 扫描路径需包含 `com.basic01` 4. **添加依赖**(pom.xml): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.5</version> <!-- 按需调整版本 --> </dependency> ``` ### 注意事项 - 方案一需在根包下创建 `@SpringBootApplication` 类 - 若使用方案二,需确保所有依赖组件都有 Spring 注解(`@Component`, `@Service` 等) - 检查 `PaymentStrategyFactory` 是否实现为 Spring Bean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值