Solon热重载 beta
- 支持Solon容器的bean新增、修改
- 快捷调用java方法支持调用Solon的bean
Controller
Controller层类的新增或修改可以进行热重载并会重新解析 Mapping 注解(如 @Mapping、@Get、@Post等)信息。
java
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Get;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
@Controller
public class DemoController {
@Inject
private DemoService demoService;
@Get
@Mapping("/demo1")
public String demo1() {
return demoService.hello3211("solon1");
}
@Get
@Mapping("/demo2")
public String demo2() {
return "demo2";
@Post
@Mapping("/demo3")
public String demo3() {
return "demo3";
}
}
- 之前的
/demo2
访问不了了,可以访问新增的/demo3
。 - 可以访问新增的
/demo1
,使用到的DemoService
也会注入到DemoController
中。
Component
简单的AOP实现,使用 @Around
注解打印方法执行前后的日志。
java
import org.noear.solon.annotation.Around;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Around(TestAopInterceptor.class)
public @interface TestAop {
}
具体实现类
java
import org.noear.solon.core.aspect.Interceptor;
import org.noear.solon.core.aspect.Invocation;
public class TestAopInterceptor implements Interceptor {
@Override
public Object doIntercept(Invocation inv) throws Throwable {
TestAop anno = inv.getMethodAnnotation(TestAop.class);
if (anno == null) {
anno = inv.getTargetAnnotation(TestAop.class);
}
if (anno == null) {
return inv.invoke();
}
System.out.println("before");
Object invoke = inv.invoke();
System.out.println("after");
return invoke;
}
}
这时我们重载DemoService
类如下
java
import io.github.future0923.debug.tools.test.solon.aop.TestAop;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
@Component
public class DemoService {
@Inject
private UserService userService;
@TestAop
public String hello1(String name) {
return userService.ab();
}
public String hello2(String name) {
return userService.ab();
}
public String hello3(String name) {
return userService.ab();
}
}
- 重载之后调用
hello1()
时候@TestAop
注解即可生效打印before
和after
日志,并且会调用userService.ab()
方法。 - 可以调用新增的
hello2()
方法。 - 删除的
hello3()
方法找不到了。
Configuration
在 @Configuration
新增了 @Bean
创建 TestConfigBean
java
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
@Configuration
public class TestConfig {
public static class TestConfigBean {
public String getName() {
return "test";
}
}
@Bean
public TestConfigBean testConfigBean() {
return new TestConfigBean();
}
}
注入到 DemoService
中并使用
java
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
@Component
public class DemoService {
@Inject
private TestConfig.TestConfigBean testConfigBean;
public String hello(String name) {
return null;
return testConfigBean.getName();
}
}
- 可以容器中可以获取到新增的
TestConfigBean
,并且DemoService
可以使用testConfigBean
。