spring之学习归纳

倖福魔咒の 提交于 2019-11-27 15:22:22

IOC

  • 什么是IOC?
    • IOC: inversion of Control(控制反转:将对象的创建权交给spring)
    • DI: 属性注入

spring的工厂类

  • BeanFactory: 老版本的工厂类
    • BeanFactory: 调用getBean的时候,才会生成类的实例.
  • ApplicationContext: 新版本的工厂类
    • ApplicationContext: 在加载配置文件的时候,就会将spring管理的类都实例化.
    • ApplicationContext有两个实现类
      • ClassPathXmlApplicationContext: 加载类路径下的配置文件
      • FileSystemXmlApplicationContext: 加载文件系统下的配置文件

spring的Bean的实例化方式(了解)

Bean已经都交给spring管理,spring创建这些类的时候 ,有几种方式:

  1. 无参构造方法的方式(默认)
<bean id="bean1" class="com.jxust.spring.demo1.Bean1"></bean>

2.静态工厂实例化的方式
3. 实例工厂实例化的方式

spring的属性注入

  1. 构造方法的方式的属性注入(注意:要设置对象类型的属性时,value要改成ref)
<!-- 构造方法的方式 -->
<bean id="car" class="com.jxust.spring.demo1.Car">
	<constructor-arg name="name" value="宝马"/>
	<constructor-arg name="price" value="80000"/>
</bean>
  1. 提供set方法的方式的属性注入
<!-- set方法注入对象类型的属性 -->
<bean id="employee" class="com.jxust.spring.demo1.Employee">
	<!-- value:设置普通类型的值,ref:设置其他的类的id或name -->
	<property name="name" value="阿涛"/>
	<property name="car2" ref="car2"/>
</bean>
  1. P名称空间的属性注入(spring2.5以后)
  • 写法:
    • 普通属性 p:属性名=”值”
    • 对象属性 p:属性名-ref=”值”
  • 先引入P名称空间的约束:
xmlns:p="http://www.springframework.org/schema/p"
  • 使用p名称空间:
<!-- 改为p名称空间的方式 -->
<bean id="car2" class="com.jxust.spring.demo1.Car2" p:name="奇瑞QQ" p:price="30000"/>
<bean id="employee" class="com.jxust.spring.demo1.Employee" p:name="李四" p:car2-ref="car2"/>
  1. SpEL的属性注入(spring3.0以后)
  • 语法: #{SpEL}
  • 注入对象属性和注入普通属性都是用value
<!--SpEL的属性注入-->
<bean id="carInfo" class="com.jxust.spring.demo1.CarInfo"/>
<bean id="car2" class="com.jxust.spring.demo1.Car2">
	<property name="name" value="#{carInfo.name}"/>
	<property name="price" value="#{carInfo.calculatorPrice()}"/>
</bean>
<bean id="employee" class="com.jxust.spring.demo1.Employee">
	<property name="name" value="#{'李四'}"/>
	<property name="car2" value="#{car2}"/>
</bean>
  1. 集合类型属性注入(略)

spring的分模块开发的配置

  • 分模块配置
    • 在加载配置文件的时候,加载多个
    ApplicationContext applicationContext=new ClassPathXmlApplicationContext(
     "applicationContext.xml","applicationContext2.xml");
    
    • 在一个配置文件中引入多个配置文件
    <import resource="applicationContext2.xml"/>
    

使用spring的核心监听器ContextLoaderListener(整合web项目)

  • 问题描述: 每次请求都会创建一个spring的工厂,浪费服务器资源,应该一个项目只有一个spring的工厂.
  • 解决思路:
    1. 在服务器启动的时候,创建一个spring的工厂.
    2. 创建完工厂,将这个工厂类保存到ServletContext中.
    3. 每次使用的时候都从ServletContext中获取.
  • 实际解决办法:
    *使用ServletContextListener监听ServletContext对象的创建和销毁.
  • 怎么使用?
    1. 引入jar包spring-web.jar
    2. 在web.xml中配置监听器,和加载spring的配置文件
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml ``` 3. 在Action中获取工厂 ``` public String save(){ //创建一个工厂类: //ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml"); ServletContext sc=ServletActionContext.getServletContext(); WebApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(sc); CustomerService customerService=(CustomerService) applicationContext.getBean("customerService"); return NONE; } ```

spring的IOC的注解开发

  1. spring的注解开发需要比之间多引入一个jar包,即aop的jar包
  2. 在spring的配置文件中引入context约束
  3. 开启spring的组件扫描(在applicationContext.xml中配置)
<!--使用IOC的注解开发,配置组件扫描(那些包下的类使用IOC的注解)-->
<!--扫描是为了扫描类上的注解-->
<context:component-scan base-package="com.jxust.spring.demo1"/>
  1. 在类上添加注解(将类交给spring管理)
@Component(“userDao”)
  1. 设置属性的值(属性注入)
    • 注解方式:使用注解方式可以不用提供set方法
      • 属性如果有set方法,需要将属性注入的注解添加到set方法上
      • 属性如果没有set方法,需要将属性注入的注解添加到属性上
    • @Value(“张三”):设置普通属性的值
    • @Resource(name=””):完成对象类型的属性的注入

IOC的XML和注解开发比较

  • 使用场景:
    • XML: 可以使用与任何场景,结构清晰,维护方便
    • 注解: 有些地方用不了(如某个类不是自己提供的),优点是开发方便

IOC的XML和注解整合开发

  • XML管理Bean(不开扫描),注解完成属性注入
  • 不开启组件扫描<context:component-scan base-package””/>
  • 开启<context:annotation-config/>,此方式可以在没有扫描的情况下,使用属性注入的注解:如@Resource,@Value等

spring的AOP的XML开发

  1. 引入相关jar包(6个基本开发包,4个aop开发相关的jar包)
  2. 创建切面类,并交给spring管理
  3. 创建目标类,并交给spring管理
  4. 通过AOP的配置完成对目标产生代理aop:config(在spring的配置文件中)
    • 通过表达式配置哪些类的哪些方法需要进行增强<aop:pointcut expression=“execution(某些类的某些方法)” id=“pointcut1”/>
    • 配置切面<aop:aspect ref=“切面类的id或name”>
      • 配置通知类型,并联系切面方法和目标方法<aop:before method=“切面类中的方法” pointcut-ref=“pointcut1”/>

spring的AOP的注解开发

  1. 引入相关jar包
  2. 创建切面类,并交给spring管理
  3. 创建目标类,并交给spring管理
  4. 在spring的配置文件中开启注解的aop开发aop:aspectj-autoproxy/
  5. 在切面类上使用注解@Aspect
  6. 在切面类的方法上使用注解@Before(value=“execution(某些类的某些方法)”)
  7. (可选)spring的AOP的注解切入点的配置

Spring和junit整合

  1. 在需要使用test的类上添加如下两个注解
    • @RunWith(SpringJUnit4ClassRunner.class)
    • @ContextConfiguration(“classpath:applicationContext.xml”)
  2. 在需要注入的属性上添加注解(如果没有可以不添加)
  3. 使用@Test

JDBC模板的使用

  • 常规流程
    1. 引入相关jar包
      • mysql-connector-java.jar
      • spring-jdbc.jar
      • spring-tx.jar
    2. 在dao中创建连接池,和jdbc模板(创建模板需要将连接池的数据源注入其中)

public void demo1(){
// 创建连接池
DriverManagerDataSource dataSource
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
dateSource.setUrl(“jdbc:mysql:///spring4_day03”);
dateSource.sestUserName(“root”);
dateSource.setPassword(“abc”);
//创建jdbc模板
JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
//使用模板更新数据
jdbcTemplate.update(“insert into account values (null,?,?)”,“lisi”,1000d);

* 进一步改进
 1. 引入相关jar包
    * mysql-connector-java.jar
    * spring-jdbc.jar
    * spring-tx.jar
 2. 将连接池和模板交给spring管理
``` 3. 使用模板(通过注入jdbcTemplate属性的方式)(比如:通过注解注入,通过XML并提供属性的set方法的方式注入)
  • 再进一步改进(抽取配置到属性文件)

    • 在上面的基础上,抽取连接池的配置到属性文件
    1. 定义一个属性文件

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring4_day03
jdbc.username=root
jdbc.password=abc

2. 在spring的配置文件中引入属性文件

   * 引入配置文件的方式(两种)
其中一种:` <context:property-placeholder location=”classpath:jdbc.properties”/>`
   * 引入属性文件的值 ${key}
   ```
<bean id="dataSource" class="org.springframework.jdbc.datasource.DrivermanagerDataSource">
 <!--属性注入-->
 <property name="driverClassName" value="${jdbc.driverClass}"/>
 <property name="url" value="${jdbc.url}"/>
 <property name="username" value="${jdbc.username}"/>
 <property name="password" value="${jdbc.password}"/>
</bean>
   ```

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!