Spring属性注入理解
先来谈下对于spring中xml与java类间的理解,在spring中通过添加对于spring框架类的引用 便可以在xml中使用相应关键字,而这些关键字以我目前的理解便是spring开发中的核心要素 通过xml文件中的这些关键字与java类的配合来更快更好的实现功能。
属性注入
属性注入一般有三种方式
构造参数:在构造参数中传递类中属性的值
set值设定:通过set()方法设置
接口实现:通过实现接口中的方法 来将值设定进去
<bean id="user" class="spring.User">
<constructor-arg name="username" value="liutianbo"></constructor-arg>
</bean>
<bean id="bood" class="spring.Bood">
<property name="boodname" value="jiuyangshengong"></property>
</bean>
这里一个bean就代表一个java类,其中id里的值代表我们给这个 java类在spring起的名字 而class则代表这个类的绝对路径,这个bean里可能有着各种各样的关键字 他使我们对这个bean进行加工修饰 例如constructor-arg这个就代表当使用有参构造方法来注入属性时该用的关键字 它里面的name代表着有参构造函数中 参数的名字 value字如其名 代表值 property关键字 则是在使用set方法注入时用的关键字 其中name的值代表所要set的属性的名字 value含义同上
注入对象属性:
<bean id="bood" class="spring.Bood">
<property name="boodname" value="jiuyangshengong"></property>
</bean>
<bean id="girl" class="spring.Girl">
<!-- bean代表的是类 property代表的是类中的属性-->
<property name="user" ref="user"></property>
</bean>
name代表属性名称 ref里的值则为在spring写下的bean的id
注入复杂类型属性:属性的类型不只简单的string 对象类型 还有array、map、list等复杂类型
<bean id="arrays" class="">
<!-- 数组 -->
<property name="array">
<list>
<value>小刚</value>
<value>小强</value>
<value>小宫</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>小红</value>
<value>小花</value>
<value>小璐</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="1" value="小1"></entry>
<entry key="2" value="小2"></entry>
<entry key="3" value="小3"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props >
<prop key="化学老师">好人</prop>
<prop key="语文老师">好人</prop>
<prop key="物理老师">好人</prop>
</props>
</property>
</bean>
以上便是属性注入我的目前所学。
IOC和DI的关系
IOC即控制反转 而DI则是依赖注入 控制反转是将写代码时类的创建这些事交给spring框架,一反之前由自己创建的习惯,将创建对象的控制权力交给spring框架,这便是控制反转。
DI则是依赖注入,所谓依赖注入,就是在生成对象的时候我们需要给对象的各个属性赋值,而很可能我们所要赋值的某个属性与其他类有依赖关系,即它的值需要某些其他类来参与生成,但这时候很明显,就与其他类有了耦合,就如小孩如果想要玩玩具那么应该由家长(IOC)来提供这些玩具,而不是小孩去主动寻找拿取这些玩具。IOC包含着DI,而DI也依赖于IOC。
Spring如何整合web项目
在写测试代码的时候,都是
ApplicationContext context=new ClassPathXmlApplicationContext("springmvc.xml");
这样来加载配置文件,但是实际项目不能写一个功能就调用这个函数,消耗性能 所以一般都是在项目启动时来加载,将加载配置文件和创建对象的过程放在服务器启动的时候。大概过程是:在服务器启动的时候,会创建一个ServletContext对象,使用监听器可以监听到ServletContext的创建,当监听到的时候加载配置文件并把配置文件中的对象创建出来用setAttribute()方法放到ServletContext域中,而等到要获取的时候,再用getAttribute()方法去得到,而监听器就是实现了ServletContextListenner接口的类。
Spring注解
- 代码里的特殊标记,使用注解可以完成功能。
- 注解写法:@注解名称(属性名称=属性值)
- 注解使用在类上面,方法上面和属性上面
注解使用方式
在xml文件中引入新的约束,然后在配置文件中加入
<!-- 开启注解扫描 -->
<context:component-scan base-package=""></context:component-scan>
其中base-package的值就是你所要扫描的包路径
Spring中常用的bean管理的注解
- @Component
- @Controller:Web层
- @Service:业务层
- @Repository:持久层
从功能上来讲以上,以上的注解都是一致的 之所以分类是标注在类的用途上的区别,使其更清晰。