A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白家鑫 初级黑马   /  2019-9-23 16:50  /  1361 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



核心:
IOC(  Inverse Of Control : 反转控制  )
AOP  (  Aspect Oriented Programming:面向切面编程)
Spring: 是使用最多的javaee企业应用开源框架,它为我们开发每一层都提供了解决方案
易于整合众多第三方框架和类库


Spring的优势

方便解耦,简化开发:
IOC控制反转,之前由我们自己创建管理对象,改为由Spring帮助我们管 理,简单的来说,不用New对象了。

AOP编程的支持:
面向切面变成,简单的来说,可以对某个类或者方法、接口设置拦截器。

声明事务的支持:
之前我们使用 Jdbc时,需要手动开启事务,然后手动提交或者回滚事务,使用 Spring声明事务管理,不在需要手动操作事务

方便程序的测试:
集成junit,方便测试
方便集成框架:
在方便集成自己框架(spring data、spring mvc等)的同时也同样方便集        成第三 方框架(hibernate、Quartz、mybatis)

降低JavaEE API的使用难度:
帮助我们封装使用繁琐的的方法,例如:JdbcTemplate、 redisTemplate、JavaMail




Spring 程序开发步骤图解


E:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/weixinobU7VjqEcTDzzfMIO7RoDotjeR1s/32f27a44e7634ab19c5624f6576adb24/spring%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4.png
总结:
首先不用每次使用的时候进行创建对象,然后对其分配内存和堆栈空间,Spring默认对Bean 的管理是单例。
低耦合:不与任何类有业务耦合,使用的时候从Spring拿就好,不需要根据业务去new对 象。



步骤解释(重点)
1.导入Spring 开发的基本包坐标
2.编写Dao接口和实现类
3.创建Spring核心配置文件
4.在Spring配置文件中配置UserDaoImpl
5.使用Spring的API获取Bean实例


Bean 标签详解
id:Bean在Spring容器中的唯一标识

class : Bean的全限定类名 (调用类的空参构造来创建Bean对象)

scope :Bean对象的作用范围
singleton                默认值,单例单一的
prototype                多例的,每次调用都会new一个新对象



singleton:
1. Bean的实例化时机:
当Spring核心配置文件被加载时,实例化配置文件中的Bean实例
2. Bean的生命周期:
对象创建:当应用加载(项目启动)创建容器时,对象就被创建
对象运行:只要容器存在,则对象一直存活
对象销毁:当应用卸载(项目停止)销毁容器时,对象就被销毁

prototype:
1. Bean实例化时机:
根据Spring核心配置文件的上下文实例getBean时,实例化Bean
2. Bean的生命周期:
对象创建:当使用对象时,创建对象实例
对象运行:只要对象在使用,则实例一直会存活
对象销毁:当一定时间不使用,则会被Java垃圾回收器进行回收


Bean的初始化与销毁方法

方法名称   init - method
bean标签中添加 init-method属性,实例化Bean之后调用初始化 方法,也就是Spring帮助我们创建完当前Bean之后,会自动调用这个方法
方法名称     destroy - method
bean标签中添加 destroy-method属性,销毁Bean之间,也就 是销毁这个对象的时候,会自动调用这个方法


Spring 配置文件-详解
Bean实例化三种方式

无参构造方法:
默认根据无参构造创建对象,企业中常用
<bean id="userdao"  class=" com.itheima.dao.impl.userDaoimpl" ></bean>

工厂静态方法
public static userdao createUserDao(){}
<bean id="userdao" class="com.itheima.faction"   factory-method="getUserDao"></bean>

工厂实例方法:
<bean id="factoryUserDaoBean" class "com.itheima........." ></bean>
<bean id="userdao"  factory-bean="factoryUserDaoBean" factory-method="createuserDao"></bean>

静态工厂方法因为其方法是静态方法,直接进行调用,工厂实例方法必须先创建工厂Bean对象,在进 行调用Bean对象中的方法
注意: 工厂实例化或者静态工厂实例化方法案例:有些对象不是根据构造方法获取的,而是根据某个方法 获取的,无参构造不能满足所有场景。





依赖注入

图解:
E:/%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/weixinobU7VjqEcTDzzfMIO7RoDotjeR1s/24d979f034b14f2bb5deeb99a5de9683/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.png

依赖注入(Dependency Injection):
它是 Spring 框架核心 IOC 的具体实现。 在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的 情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

Spring管理UserDao和UserService关系,UserService中使用了UserDao,所以需要把UserDao 注入到UserService中



set方法注入
<property name="userDao" ref="userDao"></property>
构造方法注入
  <constructor-arg name="userDao" ref="userDao"></property>

注入的三种数据类型
引用数据类型
ref   引入
普通数据类型
value  值
集合数据类型
Properties
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">   
<property name="properties">      
          <props>           
<prop key="p1">aaa</prop>         
        <prop key="p2">bbb</prop>            
<prop key="p3">ccc</prop>      
  </props>  
  </property>
</bean>

. Spring配置文件 - import和知识要点
引入其他配置文件,企业中常按照技术点进行划分配置(redis、solr、mybatis等)

<import>标签:导入其他的Spring的分文件


Spring相关API1

applicationContext:接口类型,
代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象

ApplicationContext实现类:
1. ClassPathXmlApplicationContext   
           它是从类的根路径下加载配置文件 推荐使用这种(resourcesx、classpath)
2. FileSystemXmlApplicationContext     
          它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位(C:\User\app\applicationContext.xml)
3. AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。


getBean方法()

//   根据id获取Spring容器中的Bean实例  
UserService userService1 = (UserService)applicationContext.getBean("userService");


//根据类型获取Spring容器中的Bean实例  
UserService userService2 =  applicationContext.getBean(UserService.class);





Spring配置数据源
数据源(连接池)是提高程序性能如出现的
事先实例化数据源,初始化部分连接资源
使用连接资源时从数据源中获取
使用完毕后将连接资源归还给数据源
常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等

开发步骤
1.导入数据源的坐标和数据库驱动坐标
2.创建数据源对象
3.设置数据源的基本连接数据
4.使用数据源获取连接资源和归还连接资源





Spring 注解代替源码
@Component
使用在类上用于实例化Bean
@Controller
使用在web层类上用于实例化Bean
@Service
使用在service层类上用于实例化Bean
@Repository
使用在dao层类上用于实例化Bean
@Autowired
使用在字段上用于根据类型依赖注入
@Qualifier
结合@Autowired一起使用用于根据名称进行依赖注入
@Resource
相当于@Autowired+@Qualifier,按照名称进行注入
@Value
注入普通属性
@Scope
标注Bean的作用范围
@PostConstruct
使用在方法上标注该方法是Bean的初始化方法
@PreDestroy
使用在方法上标注该方法是Bean的销毁方法


注意:
使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

<注解的组件扫描>
<context : component - scan base - package = "com.itheima">
</context : component -scan>



Spring 新注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
非自定义的Bean的配置:<bean>
加载properties文件的配置:context:property-placeholder
组件扫描的配置:context:component-scan
引入其他文件:<import>

@Configuration
用于指定当前类是一个 Spring   配置类,当创建容器时会从该类上加载注解
@ComponentScan
用于指定 Spring   在初始化容器时要扫描的包。   作用和在 Spring   的 xml 配置文件中的   <context:component-scan   base-package="com.itheima"/>一样
@Bean
使用在方法上,标注将该方法的返回值存储到   Spring   容器中
@PropertySource
用于加载.properties   文件中的配置
@Import
用于导入其他配置类


实现配置类
@Configuration
@ComponentScan("com.itheima")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
   @Value("${jdbc.driver}")
                     private String driver;
                     @Value("${jdbc.url}")
                      private String url;
                    @Value("${jdbc.username}")
                      private String username;
    @Value("${jdbc.password}")
                      private String password;

@Bean(name="dataSource")
public DataSource getDataSource() throws PropertyVetoException {
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
                   dataSource.setDriverClass(driver);
    dataSource.setJdbcUrl(url);
                        dataSource.setUser(username);
          dataSource.setPassword(password);
    return dataSource;
}

}



Spring集成Junit步骤
①导入spring集成Junit的坐标
②使用@Runwith注解替换原来的运行期
③使用@ContextConfiguration指定配置文件或配置类
④使用@Autowired注入需要测试的对象
⑤创建测试方法进行测试


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})public class SpringJunitTest {
    @Autowired
    private UserService userService;
    @Test
    public void testUserService(){
            userService.save();
    }
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马