Sping 自己学习心得(IOC)

来源:互联网 发布:java中的设计模式 编辑:程序博客网 时间:2024/06/05 16:44

1.spring是一个开源框架,为了解决企业应用开发的复杂性而创建的。
2.轻量级的控制反转(IOC)和面向切面(AOP)的容器框架;。
3.包含并管理应用对象的配置和生命周期
4.将简单的组件组装
5.开发应用简单,方便,快捷
6.Spring带来了复杂的JavaEE开发的春天


Spring作用:
1.容器
2.提供了对多种技术的支持 JMS,MQ支持,UnitTest
3.AOP(事务管理,日志)
4.提供了众多方便应用的辅助类(JDBC)
5.对主流应用框架(Hibernate)提供了良好的支持。


Spring使用范围
·构建企业应用(SpringMVC+Spring+Hibernate、ibatis)
·单独使用Bean容器(bean管理)
·单独使用AOP进行切面处理
·其他的spring功能,如:对消息的支持等
·在互联网中的应用....


面向接口编程是指提供一个接口与一个实现类,接口是提供给用户的,用户通过它来创建对象,实现类是用来实现这个对象的,而接口与实现类是通过一个implements关键字来连接的。如OneInterface oif = new OneInterfaceimp(),这个里面OneInterface就是接口,OneInterfaceimp()就是实现类,下面:
public class OneInterfaceimp() implements OneInterface{}
这就是在实现这个接口
IOC控制反转指的是不用用户自己创建对象,而是从IOC容器中取出对象使用,从IOC容器中取出的对象称为Beans,也称为依赖注入,在IOC容器中动态的将依赖关系注入给对象


什么是IOC
.IOC:控制反转,控制权转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
.DI(依赖注入)是其一种实现方式
.目的:创建对象并且组装对象之间的关系


IOC

1:找IOC容器

2:容器返回对象

3:使用对象


Bean容器初始化
.基础:两个包
--org.springframework.beans
--org.springframework.context
--BeanFactory提供配置结构和基本功能,加载并初始化Bean
--ApplicationContext保存了Bean对象并在Spring中被广泛使用
.方式,ApplicationContext
--本地文件
--Classpath
--Web应用中依赖servlet或Listener


1.BeanFactory提供配置结构和基本功能,加载并初始化Bean
2.spring中Bean指的就是对象
3.ApplicationContext保存了Bean对象并在Spring中被广泛使用

Java中:
1.接口:只有声明没有实现(Java8有实现)
2.抽象类:既有接口有又实现
3.类:只有实现

4.spring对bean的管理有两种方式:xml和注解


初始化bean容器:
1.文件:FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:/workspace/appcontext.xml");
<br>
2.前缀classpath:表示的是项目的classpath下相对路径 <br>
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:app.spring.xml");
3.web应用:
<listener> 
<listener-class>org.springframework.web.context.ContextLoaderListene</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>


spring注入指的是在启动spring容器加载bean配置的时候,完成对变量的赋值行为。
常用的两种注入方式:
1.设值注入
2.构造函数注入


@spring-injection.xml
<bean id="injectionService" class="InjectionServiceImpl">
<!--<property name="injectionDAO" ref="injectionDao"></property>--><!--设值注入-->
<constructor-arg name="injectionDAO" ref="injectionDao"></constructor-arg><!--构造注入-->
</bean>
<bean id="injectionDao" class="InjectionDAOImpl"></bean>

ref:引用


相关代码   实现 设置注入和构造注入@InjectionDAO.javapublic interface InjectionDAO {public void save(String str);}@InjectionDAOImpl.javapublic class InjectionDAOImpl implements InjectionDAO{public void save(String str) {//模拟数据库保存操作System.out.println("保存数据:"+str);}}@InjectionService.javapublic interface InjectionService {public void save(String str);}@InjectionServiceImpl.javapublic class InjectionServiceImpl implements InjectionService{private InjectionDAO injectionDAO;//设值注入:setXxx()中“Xxx”和<property name="Xxx"/>一致public void setInjectionDAO(InjectionDAO injectionDAO) {this.injectionDAO = injectionDAO;}//构造注入:(类型 xxx)中“xxx”和<constructor-arg name="xxx"/>一致public InjectionServiceImpl(InjectionDAO injectionDAO){this.injectionDAO = injectionDAO;}public void save(String str) {//模拟业务操作System.out.println("Service接收参数:"+str);str=str+":"+this.hashCode();injectionDAO.save(str);}}


Bean的常用配置项:(理论上只有class是必须的)
id:唯一标识
class:具体是哪一个类
scope:范围
constructor arguments:构造器的参数
properties:属性
Autowiring mode:自动装配模式
lazy-initialization mode:懒加载模式
initialization/destruction method:初始化/销毁的方法


Bean的作用域

singleton:单例,指一个Bean容器中只存在一份

prototype:每次请求(每次使用) 创建新的实例,destroy方式不生效

request:每次http请求创建一个实例且仅在当前reuqest内有效

session:同上,每次http请求创建,当前session内有效

global session:基于portlet的Web中有效(portlet定义了global session),如果是在web中,同session。


Bean生命周期:定义——初始化——使用——销毁
一、初始化:
方法1.实现org.springframework.beans.foctory.InitializingBean接口,覆盖afterPropertiesSet方法。系统会自动查找afterPropertiesSet方法,执行其中的初始化操作。
方法2.配置init-method
例如设置bean中init-method="init"那么在初始化过程中就会调用相应class指定类的init()方法进行初始化工作。

二、销毁(与初始化类似):
方法1.实现org.springframework.beans.foctory.DisposableBean接口,覆盖destory方法。
方法2.配置destory-method。

三、配置全局初始化、销毁方法
default-init-method="defaultInit" default-destroy-method="defaultDestory"

注意:
1、当三种方式同时使用时,全局(默认的)初始化销毁方法会被覆盖。
2、另外实现接口的初始化/销毁方式会先于配置文件中的初始化/销毁方式执行,然后再执行配置的。//初始化(接口式)——初始化(<bean>标签配置)——销毁(接口式)——销毁(<bean>标签配置)
3、即使没有以上三种初始化方法也是可以编译执行。
4、如果配置全局初始化、销毁,但没有写对应方法,则可通过编译;如果在<bean>标签中配置初始化、销毁,但没有写对应方法,则报错。



Aware
.Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后可以获取相应资源
.通过Aware接口,可以对Spring相应资源进行操作(一定要慎重)
.对为Spring进行简单的扩展提供了方便的入口


Bean的自动装配(Autowiring)
.No:不做任何操作
.byname:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
.byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用不byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生
.Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器一致的bean,那么抛出异常


Classpath扫描与组件管理
.从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用Java而不是XML定义bean比如@Configuration,@Bean,@Import,@DependsOn
.@Component是一个通用注解,可以用于任何bean
.@Repository,@Service,@Controller是更针对性的注解
--@Repository通常用于注解DAO类,即持久层
--@Service通常用于注解Service类,即服务层
--@Controller通常用于注解Controller类,即控制层(MVC)


@Autowired
1.可以用在setter方法上;
2.可以用在构造器上;
3.可以用在成员变量上
4.@Autowired(required=faluse),避免autowiring失败异常。
5.每个类只有一个构造器被标记为required=true


@Autowired注解标注的List和Map:
spring会将@Component注解标注的实现了BeanInterface的Bean的实例加载进去
@Order注解只对List有效,对Map无效

@Autowired更新的用法
.可以通过添加注解给需要该类的数组的字段或方法,以提供ApplicationContext中的所有特定类型的bean
.可以用于装配Key为String的Map
.如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用的@Order注解.

使用@Autowired注意的事项
.@Autowired是由Spring BeanPostProcessor处理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类必须通过XML或者Spring的@Bean注解加载

@Autowired
.可以使用@Autowired注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ResouceLoader,ApplicationEventPublisher,and MessageSouce


Auto wired和Qualifier结合来使用可以用来指定要注入的bean的名字,而Resource一个注解就可以做到。
@Qualifier适用于多参数的情况。
@Resource适用于一个参数的情况


基于java的容器注解(001)
@Bean标识一个用于配置和初始化一个有SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/>

可以在Spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)

上一点中,通常使用的是@Configuration和@Bean配合使用


在xml配置中,可以通过content:property-placeholder的方式引入一个配置文件。
然后在该xml配置文件中,就可以用${key}的方式来饮用properties文件中的内容。

在一个@Configuration修饰的配置类中也可以用@ImporResource来修饰这个类来引入这个配置文件,然后在这个配置类中用@Value("${key}")的方式来引用properties文件中的内容。在这个类中还要引入DataSource,用@Bean来修饰一个生产DataSource的方法。


@bean @bean(name="类名") 默认是单例的;
@scope 指定bean的作用域 值有singleton(默认),prototype(只存活于当前注解范围,每次调用都重新创建),session,request,global session


CustomAutowireConfigurer
.CustomAutowireConfigurer是BeanFactoryPostProcessor的子类,通过它可以注册自己的qualifier注解类型(即使没有使用Spring的@Qualifier 注解)
.该AutowireCandidateResolver决定自动装配的候选者:
--每个bean定义autowired-candidate值
--任何<bean/>中的default-autowire-candidates
--@Qualifier注解及使用CustomAutowireConfigurer的自定义类型


Spring对于JSR支持的说明
@Resouce
.Spring还支持使用JSR-250@Resouce注解的变量或setter方法,只是一种Java EE 5 和 6 的通用模式,Spring管理的对象也支持这种模式
.@Resouce有一样个name属性,并且默认Spring解释该值作为被注入bean的名称


0 0
原创粉丝点击