Spring框架中的IOC(控制反转)和DI(依赖注入)

IDEA运行加载文档出错

写好的maven项目在IDEA运行的时候偶尔报错

经过分析和百度,错误原因:项目依赖没有打包,IDEA无法加载本地文档,而是联网查询。
解决方案:修改maven项目的pom.xml文件的配置信息,在build标签下添加如下配置代码添加插件:
<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
      </plugin>
 </plugins>
在pluginManagement标签下开头添加如下配置代码添加插件:
<plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>2.4.3</version>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>shade</goal>
              </goals>
              <configuration>
                <transformers>
                  <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                    <mainClass>com.lanou3g.spring.App</mainClass>
                  </transformer>
                  <transformer
                          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                    <resource>META-INF/spring.schemas</resource>
                  </transformer>
                  <transformer
                          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                    <resource>META-INF/spring.handlers</resource>
                  </transformer>
                </transformers>
              </configuration>
            </execution>
          </executions>
</plugin>

懒加载

IOC容器默认在启动的时候会初始化配置文件中的所有的bean,当不是我们的代码出错而是容器加载出错可以快速提示,帮助我们排除代码错误,这叫做快速失败,大部分情况下不用修改,但特殊的时候我们不需要在容器启动时就加载bean对象,比如项目中的某个功能不常用,我们就不需要项目启动时加载这么多资源,会降低项目时效性造成浪费,需要设置这个bean对象懒加载,就是只有在调用它的时候(getBean)再加载它,具体做法是给这个bean对象加上lazy-init属性,属性值为true,默认是false,一般不写,如下:

 <bean id="studentDao" class="com.lanou3g.spring.dao.StudentDaoImpl" lazy-init="true"/>

使用注解引入XML配置

在有多个配置文件的情况下,我们会在一个配置文件中引入另外的配置文件,在XML中是使用Import标签引入另外的配置文件,如下:

<import resource="applicationContext.xml"/>

用注解的方式引入XML配置文件是这样做的:

@ImportResource("applicationContext.xml")

这两种做法的作用是一样的,掌握任意一种即可。

bean的name属性

由于bean的name属性并不常用,这里不做过多解释,它的作用和id属性一样,给当前的bean对象起名字做标记便于获取,不同之处在于name属性可以设置多个值做名字,之间用逗号隔开,请注意,起多个名字不能重复,更不能和其它bean的name属性值重复。

<bean id="student" name="stu,student1,sd1" class="com.lanou3g.spring.bean.Student">

注入匿名内部bean

注入匿名内部bean这种方式相当于给对象赋值,给对象赋值的方式有两种,一种是通过new对象,然后set对象的属性给对象的属性赋值,一种是通过带参构造函数传递参数给对象赋值,在配置文件中通过bean创建对象也可以给对象赋值,做法如下:

<bean id="outer" class="...">
    <!-- 像set一样实例化对象的方式用这样的注入方式 -->
    <property name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
        </bean>
    </property>
  	
  	<!-- 像带参构造函数实例化对象的方式用这样的注入 -->
    <constructor-arg name="target">
        <bean class="com.example.Person"> <!-- this is the inner bean -->
            <property name="name" value="Fiona Apple"/>
            <property name="age" value="25"/>
         </bean>
    </constructor-arg>
</bean>

注入集合类型的属性

注入的本质相通,都是赋值,不解释,list注入方式,Map注入方式:

 <!-- lsit注入 -->
<property name="someList">
        <list>
            <!-- 普通元素 -->
          	<value>a list element followed by a reference</value>
            <!-- 引用类型元素 -->
          	<ref bean="myDataSource" />
        </list>
</property>
 <!-- Map注入 -->
<property name="someMap">
        <map>
          	<entry key="an entry" value="just some string"/>
            <entry key ="a ref" value-ref="myDataSource"/>
        </map>
</property>

注入null和空字符串属性值

<bean class="ExampleBean">
    <property name="email" value=""/>
</bean>

<bean class="ExampleBean">
    <property name="email">
         <!-- 注意这里注入null必须写这样的标签形式,测试时报空指针,value=“null”不行,编译器把它当字			   符串,长度为4 -->
        <null/>
    </property>
</bean>

注入复合属性值

<bean id="something" class="things.ThingOne">
    <property name="fred.bob.sammy" value="123" />
</bean>

C命名空间注入构造参数

C命名空间和像set一样实例化对象的方式的传统注入方式本质一样,只需要修改一下配置文件的头部信息
就可以通过C:注入属性值,比传统注入方式简单方便
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         <!-- 这里需要配置 -->
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>
    <!-- c命名空间方式注入构造参数 -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="[email protected]"/>
</beans>

P命名空间注入构造参数

P命名空间和像带参构造函数实例化对象的方式的传统注入方式本质一样,只需要修改一下配置文件的头部信息
就可以通过P:注入属性值,比传统注入方式简单方便
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      <!-- 这里需要配置 -->
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="driver" class="com.demo.Driver" p:car-ref="car" p:dname="张三" />
  <bean id="car" class="com.demo.Car" />
</beans>

PropertyPlaceholderConfigurer工具类注入Properties文件中的属性

使用下面的注入方式,IOC容器启动的时候就会加载数据库连接的各种参数值,更高效,以后需要换数据库的时候,只需要修改jdbc.properties文件的值即可。

<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          p:driverClassName="${jdbc.driver.className}"
          p:url="${jdbc.url}"
          p:username="${jdbc.username}"
          p:password="${jdbc.password}"
          p:maxIdle="${jdbc.maxIdle}"
          p:minIdle="${jdbc.minIdle}"
          p:maxActive="${jdbc.maxActive}"
    />

jdbc.driver.className=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=root
jdbc.maxIdle=3
jdbc.minIdle=1
jdbc.maxActive=10

猜你喜欢

转载自blog.csdn.net/weixin_43311054/article/details/92110965