个人笔记,不足之处请指点,谢谢!会慢慢更新,请谅解
官网:http://spring.io/
文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/
软件框架,通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要的基本功能的软件产品
框架就是制定一套规范或者规则(思想),大家(程序员)在该规范或者规则下工作,或者说就是使用别人搭好的舞台,你来表演
框架的特点:
— 半成品
— 封装了特定的处理流程和控制逻辑
— 成熟的,不断升级改进的软件
框架与类库的区别
— 框架一般是封装了逻辑,高内聚的,类库则是松散的工具组合。
—框架专注于某一个领域,类库则是更通用的。
用于沟通的中介的抽象化
实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不受外界影响其他实体与其交互的方式。
对应Java接口即声明,声明了哪些方法是对外公开提供的。1
在 Java8中, 接口可以拥有方法体。
结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能接口,各层间仅依赖接口而非实现类
接口实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
面向接口编程“中的”接口”是用于隐藏具体实现和实现多态的组件
IOC:控制反转,控制权转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。(获得依赖对象的过程被反转了。控制反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。控制反转更合适的名字叫“依赖注入”。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 )
DI (依赖注入)是一种实现方式
目的:创建对象并组装对象之间的关系
整个版本编码的说明
下面是命名空间 和schenma 的位置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="dao"/>
<bean class="entity.User">
<property name="id" value="1"/>
<property name="name" value="wang"/>
<property name="password" value="123"/>
bean>
beans>
对象模板省略..
测试代码:
public class Test {
public static void main(String[] args) {
/*1.指定配置文件地址*/
String path="spring.xml";
/*2读取配置文件生成工具类对象*/
ApplicationContext context =
new ClassPathXmlApplicationContext(path);
/* getBean(类描述),
从spring管理的对象中找到一个符合该类型的对象*/
User bean = context.getBean(User.class);
System.out.println(bean.getId());
System.out.println(bean.getName());
System.out.println(bean.getPassword());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//注解打印
TestDao dao1 = context.getBean(TestDao.class);
dao1.showUuer();
TestDao dao2 = context.getBean(TestDao.class);
//每个bean 在spring 工厂中只会创建一个
/*用==判断两个地址是否一样*/
System.out.println(dao1==dao2);
}
}
基础包:
—org.springframework.core (spring核心jar包 猜测:是一个重用率很高的工具集合)
—org.springframework.beans (spring创建对象相关模块 )
—org.springframework.context (spring对象使用相关模块)
—BeanFactory 提供配置结构和基本功能,加载并初始化Bean
—ApplicationContext保存了Bean对象并在Spring中被广泛使用
方式,ApplicationContext
—本地文件
FileSystemXmlApplicationContext context=
new FileSystemXmlApplicationContext(“盘符路径.xml”);
—Classpath
ApplicationContext context =
new ClassPathXmlApplicationContext(….xml);
—Web应用中依赖Servlet或Listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
servlet>
<servlet-name>contextservlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServletservlet-class>
servlet>
* Spring 注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为*
常用的两种注入方法
-设值注入
class 就是创建对象,相当于让spring做了 new ...对象实例
prperty相当于调一个set方法给一个属性赋值必须命名规范 不要乱起名 会自动调用 ,Spring也不会违背封装属性,name 是一个成员变量 value 属性值(基本数据类型) ref 属性值(对象类型)引用
<bean class="entity.User">
<property name="id" value="1"/>
<property name="name" value="wang"/>
<property name="password" value="123"/>
<property name="userInfo" ref="userInfo"/>
<property name="bills">
<list>
<ref bean="bill"/>
<ref bean="bill1"/>
list>
property>
bean>
-构造注入
<bean class="com.imooc.ioc.injection.service.InjectionService">
<constructor-org name="id" value="1"/>
bean>
id:在整个IOC容器中这个bean的唯一标识
Class:具体要实例化的哪一个类
以上都是一些比较常用的
singleton:单例,指一个Bean容器中只存在一份
prototype:每次请求(每次使用)创建新的实例,destroy方式不生效
global session: 基于portlet的wed中有效(portlet定义了global session),如果是在web中,同session
@Repository,@Service,@Controller 是更有针对性的注解
@Target((ElementType.TYPE))
@Retention(RetentionPolicy.RUNTIME)
@Deprecated
@Component
public @interface Service(){
//.....
}
@Target((ElementType.TYPE))
@Retention(RetentionPolicy.RUNTIME)
@Deprecated
@Scope("session")
public @interface SessionScope{
ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT
}
@Service
public class SimpleMoviester{
private MocieFinder movieFinder;
@Autovired
public SimpleMovieLister(MocieFinder movieFinder){
this.movieFinder=movieFinder
}
}
@Repository
public class JpaMovieFinder implements MovieFinder{
// implementation elided for clarity
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config/>
beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="controller"/>
beans>
默认情况下,类被自动发现并 注册bean的条件是:使用@Component,@Repository,@Service,@Controller注解或者使用@Component的 自定义注解
可以通过过滤器修改上面的行为,如:下面例子的xml配置忽略所有的@Repository注解并用“stub”代替
<context:component-scan base-package="org.examle"/>
<context:include-filter type="regex" expression=".*stub.*Repository"/>
<context:exclude-filter type="annotation" expression ="org.springframework.stereotype.Repository"/>
<context:component-scan/>
扫描过程中组件被自动检测,那么Bean名称是由BeanNameGeanertor生成的(@Component,@Repository,@Service,@Controller都会有个name属性用于显示设置Bean Name)
可以定义bean命名策略,实现BeanNameGenerator接口,并一定要包含一个无参数构造函数器
<beans>
<context:component-scan bese-package="org.example" name-generator="org.examle.MyNameGenerator"/>
beans>
@Scope("prototype")
@Repository
public class MovieFinderImpl implement MovieFinder{
//....
}
<beans>
<context:component-scan bese-package="org.example" scope-resolve="org.example.MyScopeResolver"/>
beans>
<beans>
<context:component-scan bese-package="org.example" scope-proxy="interfaces"/>
beans>
理解就是会完成注解的扫描 base-p属性就是扫描哪个包下面的所有类
publi class SimpleMovieLister{
private MovieFinder movieFinder;
@Required //不常用
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder= movieFinder;
}
//.............
}
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder= movieFinder;
}
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao dao){
this.dao=dao;
}
public class SimpleMovieLister{
private MovieFinder movieFinder;
@Autowired(requird=false)
public void setMovieFinder(MovieFinder movieFinder){
this.movieFinder=movieFinder;
}
}
可以在spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)
上一点中,通常使 用的是@Configuration(配置的意思)
@Resource
- 如果没有显示指定@Resource 的name 默认的名称是从属性名 或者
setter方法得出
public class SimpleMovieLister{
private MovieFinder movieFinder;
@Resource
public void setMovieFinder ( MovieFinder movieFinder){
this.movieFinder=movieFinder;
}
}