spring6学习

118 阅读2分钟

一、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获取的方法

  1. 类名.class
  2. 对象.getClass()
  3. 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();