一、bean是干什么的?
java的标志是咖啡,bean是咖啡豆,bean是组成java代码的最基础的类。
在java中创建一个对象,应该使用User user = new User() ,使用spring是为了使用他的控制翻转,也就是让spring利用“反射”来负责创建对象。如果使用xml创建就可以写成:
<bean id="user" class="com.example.spring6.user"></bean>
id:唯一标识
class:要在哪个包里创建对象+要创建对象的类名称
现在spring 官方在弱化xml的方式,因为确实有点麻烦,需要重新在一个xml页面里面写这些,现在在提倡注解模式。就像以前的前端html,css,js分开在三个文件里,React搞JSX直接在一个.JSX里写就可以了。
二、bean创建的对象放到了哪?
有一个默认的Map<String, BeanDefinition>,放到了里面。 可参考:www.zhihu.com/question/47…
三、什么是AOC?
IoC是Inversion of Control,中文译为“控制反转”,Spring通过IoC管理所有java对象的实例化和初始化,控制对象之间的依赖关系。IoC容器管理的java对象称为Spring Bean。
四、基于注解管理Bean
1.使用注解定义Bean
package com.example.spring6;
import org.springframework.stereotype.Component;
@Component
public class User {
}
@Component作用于类,告诉类创建Bean
接下来写一个测试:
package com.example.spring6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUser {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean(User.class);
System.out.println(user);
}
}
输出为
[main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'user'
com.example.spring6.User@3f2ef586 //User在这
说明spirng成功创建了User的Bean。
与@Component功能相同但应用在不同地方的注解还有三个,以下是对比:
@Component:可以应用于任何层次,是泛化的概念。
@Repository:应用于Dao层
@Service:应用于Service层
@Controller:应用于控制层(如SpringMVC中的Controller)
2.依赖注入
什么是依赖注入?A需要依赖B运行,而B又需要依赖C运行,B就是A的依赖,C是B的依赖。所以我们写了一个A,就需要把C注入B,把B注入A,这样A才能运行。 在分别创建了A、B、C三个bean之后,就需要把这几个bean进行依赖注入。
可以使用@Autowired和@Resource进行注入,他们的区别可以参考: www.zhihu.com/question/39…
五、IoC实现原理:反射
1.反射中Class获取的方法
- 类名.class
- 对象.getClass()
- Class.forName("全路径")
2.获取Class与实例化
使用对象.getDeclaredConstructor().newInstance()进行实例化
public class User{ //创建一个个类
}
Class clazz = User.class; //初始化一个类的对象
User user = (User) clazz.getDeclaredConstructor().newInstance();
3.获取构造方法
Class clazz = User.class;
//获取所有public构造方法
Constructor[] constructors = clazz.getConstructors();
//获取所有构造方法(public和private)
Constructor[] constructorsAll = clazz.getDeclaredConstructors();
4.获取属性
Class clazz = User.class;
//获取所有public属性
Field[] fields = clazz.getFields();
//获取所有属性
Field[] fieldAlls = clazz.getDeclaredFields();
5.获取方法
//获取所有public方法
Method[] methods = clazz.getMethods;
//获取所有方法
Method[] methodsAll = clazz.getDeclaredMethods;
调用方法:
methods[0].invoke();