黑马程序员技术交流社区

标题: spring概念和基础知识 [打印本页]

作者: 丶笑笑    时间: 2018-7-6 10:14
标题: spring概念和基础知识
Spring概念:
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
作用:
1.Spring致力于提供一种方法管理你的`业务对象`。
2.Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的
    因此使用不同部分需要导入的包不同,自己需要总结
Spring的主要目是`使JavaEE易用`和`促进好编程习惯`
Spring致力于J2EE应用的各层解决方案,而不是仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式 ”选择 ,并贯穿表现层、业务层及 持久层 。然而 ,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
优点
   方便解耦,简化开发
Spring就是一个大工厂,可以将所有`对象创建`和`依赖关系`维护,交给Spring管理
-   IOC:   `工厂模式+XML+反射`来管理对象,提供对象的创建
-   DI:    利用反射操作setter或者构造器来注入属性
   AOP编程的支持
Spring提供`面向切面编程`,可以方便的实现对程序进行权限拦截、运行监控等功能
-   底层:     动态代理:JDK动态代理:proxy    +   cglib动态代理
   声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
-   提供通知,无需自己编写通知
   方便程序的测试
Spring对Junit4支持,可以通过`注解`方便的`测试Spring程序`
   方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
   降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
Spring体系结构:
图中将spring分为5个部分:coreaopdata accesswebtest,图中每个圆角矩形都对应一个jar
spirng Bean★Spring的核心机制IOC(控制反转)
程序主要是通过Spring容器来访问容器中的Bean,将对象的创建交给spring。
ApplicationContext是Spring容器最常用的接口,该接口两个实现类
DI(依赖注入)
Spring框架的核心功能有两个:
    Spring容器作为超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean。
    Spring容器管理容器中Bean之间的依赖关系,Spring使用一种被称为"依赖注入"的方式来管理Bean之间的依赖关系。
使用依赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。依赖注入是一种优秀的解耦方式,其可以让Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
spring开发环境搭建
spring开发中,我们要根据不同的情况来导入不同的jar,对于iocdi我们只需要使用spring的核心功能。
beans相关
core相关
context相关
spel相关
我们需要在src下创建一个关于spring的配置文件,一般情况名称叫applicationContext.xmlspring的使用需要读取此文件,利用工厂
配置文件约束路径:
spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html
IOC+DI入门步骤:
1.  在applicationContext.xml文件中配置bean
    <beans>
        <!--new对象-->
        <!--name属性值必须唯一-->
        <bean name="" class="">
        <!--对象.setXXX(String.class)-->
        <property name="XXX" value=""></property>
        </bean>
    </beans>
2.  创建一个AppliCationContext对象
   ApplicationContext它是BeanFactory的一个子接口,我们在使用时使用的是AppliCationContext的实现类       ClassPathXmlApplicationContext
3.可以通过getBean(配置文件中id/name名称)来获取指定的对象。
Bean的获取和实例化:各工厂之间的关系:获取方式:
ApplicationContext它是扩展BeanFactory的子接口。

BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean
其他工厂使用立即加载开发:原因:对象占用内存很少,不会造成内存溢出
hibernate使用延迟加载原因:立即加载时SQL语句太多,数据库服务器扛不住

在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类,
    FileSystemXmlAppliCationContext根据文件路径获取
   ClassPathXmlApplicationContext  根据类路径获取
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext它提供不同的应用层的Context实现。例如在web开发中可以使用`WebApplicationContext.`
实例化方式:
1. 无参数构造
    入门使用的方式,也是常用的方式
2. 静态工厂方法:
    需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。
    applicationContext.xml中配置:
    <!-- 静态工厂方法-->
    <bean name="bean2" class="cn.itheima.bean.Bean2Factory" factory-method="createBean2"</bean>
3. 实例工厂方法
    需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean
    <!-- 实例工厂方法-->
    <bean name="bean3Factory" class="cn.itheima.bean.Bean3Factory"></bean>
    <bean name="bean3" factory-bean="bean3Factory"factory-method="createBean3"></bean>
Bean的作用域:
在bean声明时它有一个scope属性,它是用于描述bean的作用域。
可取值有:
    singleton: 单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope)
    prototype: 多例 每一次从spring容器中获取时,都会返回一个新的实例
    request:   用在web开发中,将bean对象request.setAttribute()存储到request域中
    session:   用在web开发中,将bean对象session.setAttribute()存储到session域中
在开发常用的值是singleton与prototype,JavaEE三层架构中web是多例,其他为单例
Bean的属性注入:普通属性:
在spring中bean的属性注入有两种:
    构造器注入:
       需要提供相应的构造器
       <bean id="book1" class="cn.itheima.di.Car">
            <constructor-arg index="0" type="java.lang.String" value="奔弛"></constructor-arg>
            <constructor-arg index="1" type="double" value="1000000"></constructor-arg>
       </bean>
    setter方法注入:
       需要提供set方法
       上面使用的方法
       <property name="" ref="其他bean的name属性值"></property>
       ref作用:引入另一个bean对象,完成bean之间注入
集合属性注入:
集合注入主要用来设置配置文件的信息:如整合hibernate
<!-- 给数组注入-->
<property name="bookName">
    <list>
        <value>麦田里的守望者</value>
        <value>沧浪之水</value>
        <value>动物庄园</value>
        <value>颠覆者</value>
    </list>
</property>
<!-- 给list注入值 list 中可以有相同的对象-->  
<property name="bookList">  
    <list>  
        <ref bean="book"/>  
        <ref bean="book"/>  
        <ref bean="book"/>
        <ref bean="book"/>
        <ref bean="book"/>
    </list>  
</property>  
<!-- 给set注入值 set不能有相同的对象-->  
<property name="bookSets">  
    <set>  
        <ref bean="book"/>  
        <ref bean="book"/>  
        <ref bean="book"/>  
        <ref bean="book1"/>  
    </set>  
</property>
<!-- 给属性集合配置properties对象(底层就是map) -->  
<property name="pp">
    <props>
        <prop key="pp1">倚天屠龙记</prop>
        <prop key="pp2">笑傲江湖</prop>
        <prop key="pp3">天龙八部</prop>
    </props>
</property>
**Spring注解开发:额外的包:
commons-logging-1.2.jar
log4j-1.2.16.jar

注意:
    spring-aop-4.2.4.RELEASE.jar
配置applicationContext.xml(需要在schema约束中引入context命名空间)
<?xmlversion="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    ------------------引入context命名空间---------------------------
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans[url]http://www.springframework.org/schema/beans/spring-beans.xsd[/url]
       http://www.springframework.org/schema/context[url]http://www.springframework.org/schema/context/spring-context.xsd[/url]">
    ----------------------------------------------------------------
   
    ---------扫描指定包,这样就能在对应包下的类中使用注解------------
    <context:component-scanbase-package="com.itnannan" />
    ----------------------------------------------------------------
</beans>
入門操作:
@Service
public class BookServiceImpl implements BookService {
   
    @Value("麦田里的守望者")
    private String name;
    @Value("青少年的烦恼事")
    private String msg;
   
    @Autowired
    private BookDao bookDao;

    @Override
    public void add() {
       System.out.println("BookService add.....");
       bookDao.add();
      
    }
}


@Repository
public class BookDaoImpl implements BookDao {

    @Override
    public void add() {
       System.out.println("bookDao add.....");
    }   
}
注解的解释说明:
解释说明:

    a)  @Component
    相当于  <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl">
    @Component有三个衍生注解功能一样,只是对作用位置进行区分
       @Repository   用于DAO层
       @Service      用于service层
       @Controller   用于表现层
   
   
    b)  @Value
    相当于<property name="name" value="麦田里的守望者"/>
   
    c)  @Autowired    @Qualifier 两者需要同时使用
       @Autowired 自动装配对象
       @Qualifier 装配指定名称对象
   
    d)  @Resource
       相当于@Autowired和@Qualifier一起配置
   
    e)  @Scope
    相当于  <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" scope="singleton"> </bean>
    @Scope取值有4个
           singleton     单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope)
           prototype     多例 每一次从spring容器中获取时,都会返回一个新的实例
           request       用在web开发中,将bean对象request.setAttribute()存储到request域中
           session       用在web开发中,将bean对象session.setAttribute()存储到session域中
           
    f)  @PostConstruct   
    相当于  <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" init-method="mInit" > </bean>
   
    g)  @PreDestory      
    相当与  <bean id="bookService" class="com.itnannan.service.impl.BookServiceImpl" destory-method="mDestory" > </bean>
    注意:对于销毁的方法它只对bean的scope=singleton有效。而且需要调用销毁方法
注解使用对象:
注解主要用于JavaEE三层架构的service,dao层的对象创建和属性注入
web为多线程,所以@Scope设置为prototype多例,也就`不需要设置名称`了
由于三层之间免不了持有下层的对象所以使用@Autowired   自动装配下层对象即可






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2