注意 entity dto vo 等等 和 controller serviceImpl component 等等 同样的都是类
注意 entity dto vo 等等 和 controller serviceImpl component 等等 同样的都是类
注意 entity dto vo 等等 和 controller serviceImpl component 等等 同样的都是类
一个类里面到底有什么
变量 与 方法
成员变量从哪里来:
1:从 @Autowire Spring容器中引入
2:从 有参构造方法 引入
3:New了一个 对象 引入(在类中new 或方法中new)
4:反射
方法分几种:
1:普通方法
2:无参构造方法
3:有参构造方法
引入类的方法一:使用Autowire
注意使用条件
1:被引用的类 必须已经注入到Spring 容器中
如使用类上 @Controller @Service @Component @Repository
如对象用了@Bean
2:引用类 如AutowiredDemo作为引用类 引用了 被引用类
不能被New出来 否则 @Autowired 会失效
AutowiredDemo autowiredDemo = new AutowiredDemo()
AutowiredDemo 里面的@Autowired的属性 报错 never assigned(为null)
public class AutowiredDemo{
@Autowired
private Component component;
@Autowired
private Service service;
@Autowired
private Mapper mapper;
//本类中调用
public void autowiredDemo(){
component.methed()
service.method()
mapper.method()
}
}
引入类的方法二:在构造方法引入
可以存放到构造方法中Constructor
不管是否已经注册到spring的类 还是其他jar包中的类 还是普通的类都可以
但之后使用 New 该ConstructorDemo类的对象时 需要传入大量参数
public class ConstructorDemo{
private Component component;
private Service service;
private Mapper mapper;
public void ConstructorDemo(Component component ,Service service,Mapper mapper ){
this.component = component;
this.service = service;
this.mapper = mapper;
}
public void constructorDemo(){
component.methed()
service.method()
mapper.method()
}
}
引入类的方法三:直接通过New一个该类的对象
直接New一个对象:
需要 该对象 有参构造方法 或 无参构造方法
可以在类中New 也可以在方法中New
public class ClassNewDemo{
private Class class = new Class();
public void classNewDemo(){
class.methed()
}
}
public class MethodNewDemo{
public void MethodNewDemo(){
Class class = new Class();
class.methed()
}
}
引入类的方法四:反射
应用场景:
角色:使用类
引用类
被引用类
1:使用类中类 New一个引用类的对象
2:引用类中 想使用 被引用类的方法
3:被引用类 是一个Spring 管理的类
由于上文讲过
引入类 这个时候使用@Autowired 来使用 被引用类 是会报空指针(never assigned)
那么现在可用通过反射的方式
Method mehtod;
Class componentClass = Component.class;
// 反射出来的类 使用构造方法创建的对象也无法引用 @Autowired
// Object obj = componentClass.getConstructor().newInstance();
//获取对象
Object obj = ApplicationContextHelper.popBean(componentClass);
//获取方法
mehtod = componentClass.getMethod("methodName", String.class);
Object objInvoke = new Object();
//获取返回 使用Object 泛型来接收
objInvoke = mehtod.invoke(obj, "入参);
//最后 强转一下
(<T>)objInvoke
@Component
public class ApplicationContextHelper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
applicationContext = context;
}
/**
* 解决反射类获取的Bean 无法使用 AutoWire的问题
* @param clazz
* @param <T>
* @return
*/
public static <T> T popBean(Class<T> clazz) {
//先判断是否为空
if (applicationContext == null) {
return null;
}
return applicationContext.getBean(clazz);
}
public static <T> T popBean(String name, Class<T> clazz) {
if (applicationContext == null) {
return null;
}
return applicationContext.getBean(name, clazz);
}
}