Spring学习(1)

50 阅读2分钟

Springboot与SpringCloud

前者进行模块的开发与构建,后者实现模块之间的联系与通信。

IOC

传统的编程中,我们new出一个实例,那么这种带代码在后期如果需求发生了改变,我们需要对代码进行实时的调整。 而通过向函数传入一个类的方式,程序不再具有主动性,变成了被动的接收对象。

Bean

构建类 -> xml配置Bean -> 程序调用xml文件中。 这个流程就像是我们创建了一个东西,把它放在了Bean这个碗里,每当我们需要用的时候就从碗里拿。
在基本的类中,要有GET与SET方法,Bean会使用Set方法进行属性的赋值,我们也就吧这个东西叫做注入。

依赖注入

  • 依赖:指Bean对象的创建依赖于容器,Bean对象的依赖资源。
  • 注入:指Bean对象那个所依赖的资源,由容器来设置和装配。

注入有很多种方法:

  • 构造器注入 就是通过构造器关键字来
  • Set注入
<bean id="hello" class="com.kuang.pojo.Hello">
    <property name="str" value="Spring"/>
</bean>

<bean id="address" class="com.kuang.pojo.Address"></bean>

<bean id="student" class="com.kuang.pojo.Student">
    <!--第一种普通值注入,value-->
    <property name="name" value="fuck"/>
    <!--第二种bean注入,ref-->
    <property name="address" ref="address"/>
    <!--第三种数组注入,ref-->
    <property name="books">
        <array>
            <value>红楼梦</value>
            <value>西游记</value>
            <value>三国</value>
        </array>
    </property>

    <!--第四种List注入,ref-->
    <property name="hobbys">
        <list>
            <value>红楼梦</value>
            <value>西游记</value>
            <value>三国</value>
        </list>
    </property>

    <!--第五种Map注入,ref-->
    <property name="card">
        <map>
            <entry key="身份证" value="101010101010101111"/>
        </map>
    </property>

    <property name="games">
        <set>
            <value>LOL</value>
            <value>LOA</value>
            <value>LOB</value>
        </set>
    </property>

    <property name="wife">
        <null></null>
    </property>

    <property name="info">
        <props>
            <prop key="driver">2019112222</prop>
            <prop key="username">小明</prop>
        </props>
    </property>
</bean>
  • 命名空间注入
<!--p空间注入,其实就是property的缩写,简易一些-->
<bean id="user" class="com.kuang.pojo.User" p:name="小王" p:age="19"/>

<!--c空间注入,构造器注入,简易一些-->
<bean id="user2" class="com.kuang.pojo.User" c:age="18" c:name="小王2" />

自动装配

byName : 会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
byType : 会自动在容器上下文中查找,和自己对象属性类型相同的bean,Type的方法的好处就是可以不用写id,减少了一定的代码量。
同样byType会对bean的属性类型数量做出限制,每种属性类型只允许存在一个。

<bean id="people" class="..." autowire="byType">

- byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致
- bytype的时候,需要抱枕所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

使用注解实现自动装配

@Autowired就是用来实现这个东西的,和上一小节提供的autowire是一个作用,并且添加了 @Autowired之后也不必再写SET方法,当然命名要符合ByName或者ByType规范,这样xml文件才有迹可循。

//如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空。
@Autowired(required = false)

一些注解

@Component: 等价于<bean id="..." class="..."/> 把这个注解放在类上面,相当于是帮助我们编写了bean,相当于这个类被spring管理了。

@Value:对类的属性进行赋值。

@Configuration:上一层也是 @Component,也就意味着它也会被Spring容器托管,注册到容器中。这个注解代表当前的类是一个配置类,就是之前看的beans.xml