spring day2深入学习

1、Spring实现依赖注入的四种方式

1.set注入:

<!--set注入-->
    <bean id="emp" class="com.example.ditest.Emp">
        <property name="ename" value="张三"></property>
        <property name="age" value="19"></property>
    </bean>

2.构造函数注入 :

<!--构造注入 1.先把 daoimpl  注册进来  2.在serveice 写一个构造函数依赖注入-->
    <bean id="userMapper" class="com.example.mapper.SmsUserMapperImpl"></bean>
 
    <bean id="userService" class="com.example.service.UserServiceImpl">
 
        <constructor-arg ref="userMapper"></constructor-arg>
    </bean>

3.p命名空间注入:

<bean id="唯一标识" class="类的全路径"
	p:"属性1"="注入的值" p:"属性2"="注入的值"  />
<bean id="唯一标识" class="类的全路径"
	p:属性-ref="注入的Bean" />

4.注解注入 :

   注解方式将Bean的定义信息和Bean实现类结合在一起

        Spring提供的注解有:

1,@Component:实现Bean组件的定义

@Component
public class MyComponent {
  // 类的实现...
}

2,@Repository:用于标注DAO类

@Repository("userDao")
<!-- 与在XML配置文件中编写<bean id="userDao" class="dao.impl.UserDaoImpl" />等效-->
public class UserDaoImpl implements UserDao {
	…
}

3,@Service:用于标注业务类 

@Service("userService")
public class UserServiceImpl implements UserService {
    <!--使用@Autowired注解实现Bean的自动装配-->
	@Autowired
    <!--默认按类型匹配,可使用@Qualifier指定Bean的名称-->
	@Qualifier("userDao")
     <!--为dao属性注入名为userDao的Bean-->
	private UserDao dao;
	……
}

4,@Controller:用于标注控制器类

  1. 在目标类上添加@Controller注解,将其标记为一个控制器类:
@Controller
public class MyController {
  // 控制器的实现...
}

记得在Spring配置文件中配置组件扫描,以便Spring容器能扫描实例化@Controller注解标记的控制器:

<context:component-scan base-package="com.example" />

这里的com.example是目标类所在的包路径,用于指定需要扫描的组件所在的包。

在控制器类中定义处理请求的方法,可以使用@RequestMapping等注解来标注方法,指定请求的URL路径和请求方法:

@Controller
public class MyController {
  
  @RequestMapping("/hello")
  public String hello() {
    // 处理请求的逻辑...
    return "hello"; // 返回视图名
  }
}

创建Spring MVC的DispatcherServlet,并将其配置在web.xml文件中:

<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
 
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

 

在配置中,将DispatcherServlet映射到根路径"/",并指定Spring配置文件的位置。

通过以上步骤,就可以将一个类标记为一个Spring MVC的控制器,并使用@RequestMapping等注解来定义处理请求的方法。当用户请求对应的URL时,Spring MVC会调用相应的方法进行处理,并返回指定的视图。

@Controller注解是Spring MVC中非常常用的注解之一,它将控制器类标记为一个特殊的组件,用于处理用户请求。


最重要的需要扫描包中注解标注的类:

<?xml version="1.0" encoding="UTF-8"?>
<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="com.example"/>
</beans>

AspectJ

u面向切面的框架,它扩展了Java语言,定义了AOP语法,能够在编译期提供代码的织入

@AspectJ

uAspectJ 5新增的功能,使用JDK 5.0注解技术和正规的AspectJ切点表达式语言描述切面

Spring通过集成AspectJ框架实现了以注解的方式定义切面,使得配置文件的代码大大减少

u利用轻量级的字节码处理框架asm处理@AspectJ中所描述的方法参数名

注意事项:

使用@AspectJ,首先要保证所用的JDK是5.0或以上版本
 

 二,不同数据类型注入

 

 <!--不同数据类型注入 -->
    <bean id="emp2" class="com.example.ditest.Emp">
        <!--普通属性-->
        <property name="ename" value="李四"></property>
        <!--空字符串和null-->
        <property name="age">
            <null/>
        </property>
        <!--小于号在XML文档中用来定义标签的开始,不能随便使用-->
        <!--解决方案一:使用xML实体来代替-->
        <property name="loves" value="&lt;&gt;"/>  <!--表示大于和小于-->
 
        <!-- 解决方案二:使用CDATA节 -->
        <property name="dept">
            <!-- CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据-->
            <!-- XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析-->
            <!--所以CDATA节中写什么符号都随意-->
            <value><![CDATA[a < b]]></value>
        </property>

三、单例模式(Singleton)

什么是单例模式?
保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

为什么要用单例模式?


1、单例模式节省公共资源

比如:大家都要喝水,但是没必要每人家里都打一口井是吧,通常的做法是整个村里打一个井就够了,大家都从这个井里面打水喝。

对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。

2、单例模式方便控制

就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都乱七八糟,如果想要控制日志的正确性,那么必须要对关键的代码进行上锁,只能一个一个按照顺序来写,而单例模式只有一个人来向日志里写入信息方便控制,避免了这种多人干扰的问题出现。

实现单例模式的思路


1. 构造私有:

如果要保证一个类不能多次被实例化,那么我肯定要阻止对象被new 出来,所以需要把类的所有构造方法私有化。


2.以静态方法返回实例。

因为外界就不能通过new来获得对象,所以我们要通过提供类的方法来让外界获取对象实例。

3.确保对象实例只有一个。

只对类进行一次实例化,以后都直接获取第一次实例化的对象。

/**
 * 单例模式案例
 */
public class Singleton {
	//确保对象实例只有一个。
 private static final Singleton singleton = new Singleton();
	//构造方法私有
 private Singleton() {
    }
 //以静态方法返回实例
 public static Singleton getInstance() {
 return singleton;
    }
}

这里类的实例在类初始化的时候已经生成,不再进行第二次实例化了,而外界只能通过SingleCase.getInstance()方法来获取SingleCase对象, 所以这样就保证整个系统只能获取一个类的对象实例。

单例模式的两种实现方式(饿汉式、懒汉式)

一、饿汉式

饿汉模式,可以想象一个很饿的人,需要立马吃东西,饿汉模式便是这样,在类加载时就创建对象,由于在类加载时就创建单例,因此不存在线程安全问题

//饿汉式
public class SingletonDemo1 {
    //私有化构造器
    private SingletonDemo1() {
    }
    //类初始化时立即加载该对象
    private static SingletonDemo1 instance = new SingletonDemo1();
    //提供公共的获取方法,由于静态的instance在类加载时就创建,因此不存在线程安全问题
    public static SingletonDemo1 getInstance() {
        return instance;
    }
}
//测试
class SingletonDemo1Test {
    public static void main(String[] args) {
        SingletonDemo1 instance = SingletonDemo1.getInstance();
        SingletonDemo1 instance1 = SingletonDemo1.getInstance();
        System.out.println(instance == instance1); //输出true
    }
}

但饿汉式也存在一定的问题,即如果在该类里面存在大量开辟空间的语句,如很多数组或集合,但又不马上使用他们,这时这样的单例模式会消耗大量的内存,影响性能

二、懒汉式

顾名思义,懒汉式,就是懒,即在类加载时并不会立马创建单例对象,而是只生成一个单例的引用,即可以延时加载

//懒汉模式
public class SingletonDemo2 {
    //私有化构造器
    private SingletonDemo2() {
    }
    //只提供一个实例,并不创建对象
    private static SingletonDemo2 instance;
    //提供公共的获取方法,因为不是在类加载时就创建对象,因此存在线程安全问题,使用synchronized关键字保证线程安全,效率降低
    public static synchronized SingletonDemo2 getInstance() {
        if (instance == null) {
            instance = new SingletonDemo2();
        }
        return instance;
    }
}
//测试
class SingletonDemo2Test {
    public static void main(String[] args) {
        SingletonDemo2 instance = SingletonDemo2.getInstance();
        SingletonDemo2 instance1 = SingletonDemo2.getInstance();
        System.out.println(instance == instance1); //输出true
    }
}

 比较:

  • 饿汉式:线程安全(不排除反射),调用效率高,不能延时加载
  • 懒汉式:线程安全(不排除反射),调用效率不高,可以延时加载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 很高兴听到您对Spring Boot 2的学习感兴趣。Spring Boot是一个基于Spring框架的快速开发应用程序的工具,它提供了一种简单的方式来创建和配置Spring应用程序。以下是一些学习Spring Boot 2的笔记: 1. Spring Boot 2的新特性:Spring Boot 2相对于Spring Boot 1.x版本来说,有许多新的特性和改进。例如,它支持Java 9和10,提供了更好的响应式编程支持,以及更好的安全性和监控功能。 2. Spring Boot 2的核心组件:Spring Boot 2的核心组件包括Spring Framework、Spring MVC、Spring Data和Spring Security等。这些组件提供了一系列的功能和工具,使得开发人员可以更加轻松地构建和管理应用程序。 3. Spring Boot 2的配置:Spring Boot 2的配置非常简单,它提供了一种基于注解的方式来配置应用程序。开发人员可以使用@Configuration和@Bean注解来定义配置类和Bean。 4. Spring Boot 2的启动器:Spring Boot 2提供了一系列的启动器,这些启动器可以帮助开发人员快速地集成各种常用的框架和库,例如Spring Data JPA、Spring Security、Thymeleaf等。 5. Spring Boot 2的测试:Spring Boot 2提供了一系列的测试工具,例如Spring Boot Test、Mockito、JUnit等。这些工具可以帮助开发人员编写高质量的单元测试和集成测试。 希望这些笔记对您学习Spring Boot 2有所帮助。如果您有任何问题或疑问,请随时联系我。 ### 回答2: Spring Boot 是一个非常流行的开源框架,它的目的是使 Spring 应用程序的开发过程更加简单、快速和高效。Spring Boot 2 是 Spring Boot 框架的第二个版本,已经成为了当今业界最流行的 Java 开发框架之一。 Spring Boot 2 的新特性: 1. 支持 JDK 9。Spring Boot 2 已经支持 JDK 9 所带来的新特性和功能。 2. 基于 Reactive Streams 的编程模型。Spring Boot 2 增加了对 Reactive Streams 的支持,可以开发响应式应用程序,从而提高了系统的吞吐量和性能。 3. 异步服务器支持。Spring Boot 2 已经支持多种异步服务器,包括 Netty、Undertow 和 Tomcat。 4. 更全面的 Actuator 组件。Actuator 是 Spring Boot 的监控和管理组件,Spring Boot 2 在 Actuator 组件上增加了更多的指标、健康检查和应用程序信息。 5. 更好的自定义配置。Spring Boot 2 简化了自定义配置的流程,使得用户可以更快速地配置应用程序。 学习 Spring Boot 2 的步骤如下: 1. 掌握 Spring 基础知识。学习 Spring Boot 2 前需要掌握 Spring MVC、Spring Data 等相关的知识。 2. 下载安装 Spring Boot。Spring Boot 2 可以在官网上下载。 3. 学习 Spring Boot 核心组件。包括 Spring IoC、Spring AOP、Spring MVC 等核心组件。 4. 开发一个 Spring Boot 应用程序。可以从一个简单的 Hello World 开始,逐渐增加功能,学习和理解 Spring Boot 的各种特性和功能。 5. 掌握 Spring Boot 的自动配置。Spring Boot 的自动配置可以大大减少开发人员的工作量,学习和掌握自动配置非常重要。 总之,学习 Spring Boot 2 需要不断地实践和探索,只有通过实际的开发经验才能真正掌握和学会这个框架。 ### 回答3: Spring Boot是一款基于Spring框架的快速应用开发框架。在应用开发的过程中,Spring Boot可以自动配置一个相对完整的Spring应用程序,从而大大减少了开发者的工作量,提高了开发效率。显然,它的学习是很有必要的。 Spring Boot 2.x版本相比于1.x版本在很多方面都进行了升级和改进。在学习的过程中,需要关注的重点在以下几点: 1. 新建Spring Boot项目 Spring Boot提供了Spring Initializr来快速创建新的Spring Boot项目。在构建项目的过程中,我们可以自定义项目的基本信息、项目类型、依赖关系等,可以根据需求灵活选择。 2. Spring Boot自动配置 Spring Boot借助于自动配置功能,可以为开发者免去大量的配置工作。Spring Boot把一些常用的配置提取为Starter,开发者只需要引入这些Starter即可实现自动配置,大大降低了开发成本。 3. Spring Boot集成 Spring Boot集成了众多流行的框架,如MyBatis、Hibernate、JPA、Thymeleaf等,只需要简单的配置就可以实现对这些框架的集成,使得在开发中更加方便。 4. Spring Boot监控管理 Spring Boot通过Actuator提供了一系列配置和管理服务,可以实现对Spring Boot应用程序的监控和管理。开发者可以通过这些服务来监控应用程序的运行状态、访问量、资源使用情况等。 5. Spring Boot测试 Spring Boot天生适合进行单元测试和集成测试,可以使用JUnit、Mockito、Spring Test等框架进行测试。同样可以利用Spring Boot提供的Test Starter进行自动配置,减少测试的开发成本。 以上就是Spring Boot 2的一些学习笔记,它的结构简洁,代码清晰,便于开发者使用。无疑,Spring Boot 2是一个非常适合作为开发者日常工作的框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值