Spring笔记(1)

Spring笔记(1)

Spring快速入门

开发步骤

  1. 导入坐标

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>
    
  2. 创建Bean

  3. 创建applicationContext.xml, 并加入头

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    

    在配置文件中进行配置,添加

    标签,id… class.. (执行无参构造)

    <bean id = "userDao" class="Dao.Impl.UserDaoImpl"></bean>
    
  4. 创建applicationConetext对象

    ApplicationContext app = new ClassPathXmlApplicationContext(“applicationContext.xml”);

  5. 使用getBean获取对象,参数传入id值

bean标签的范围

默认scope取值为singleton

  • 当Spring核心文件加载时,实例化配置的Bean实例
  • 单例
  • 销毁:销毁容器,对象被销毁

当取值为prototype时

  • 当调用getBean()方法时,创建新的对象
  • 多例
  • 销毁:当对象长时间不适用,被java垃圾回收器回收

bean实例化的三种方法

  1. 无参构造

  2. 静态工厂

    ​ 标签中添加factory-

  3. 实例工厂

配置文件

依赖注入

1.概念

浅谈IOC:https://blog.csdn.net/ivan820819/article/details/79744797

依赖关系的管理交给spring维护,在当前类需要用到其他类的对象,由spring为我们提供,只需在配置文件中说明关系的维护;

IOC的作用:降低程序之间的耦合(依赖关系)

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

img

由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

IOC中最基本的技术就是“反射(Reflection)”编程

2.在service内部进行依赖注入dao

1.set方法注入

(name 值为属性,ref为容器内部的bean)

<bean id = "userService" class="Service.Impl.UserServiceImpl">
<!--        name为属性的名字, ref:注入容器id为userDao的变量-->
        <property name="userDao" ref="userDao"></property>
    </bean>

在service实现类中不需要使用application获取dao对象了,

可直接使用依赖注入的dao

public class UserServiceImpl implements UserService {
    //成员变量
    private UserDao userDao;
    //使用依赖注入的dao对象
    public void setUserDao(UserDao userDao){
        //userDao为容器内部的注入
        this.userDao = userDao;
    }
    @Override
    public void save() {
        //不需要单独获取userDao了
        /*ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");*/
        userDao.sava();

    }
}
  • 还可以p命名空间注入

2.构造方法的注入

(name为参数名,ref为id值得引用)

<bean id = "userService" class="Service.Impl.UserServiceImpl"> 
		<!--构造方法注入-->
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

依赖注入的数据类型

  1. 普通数据类型

    <bean id = "userDao" class="Dao.Impl.UserDaoImpl">
    <!--        普通数据依赖注入-->
            <property name="username" value="zhangsan"/>
            <property name="age" value="18"/>
    
        </bean>
    
  2. 引用数据类型

    list集合依赖注入

    map集合依赖注入

    properties注入

    <bean id = "userDao" class="Dao.Impl.UserDaoImpl">
    <!--        2.list集合依赖注入-->
            <property name="strList">
                <list>
                    <value>aaa</value>
                    <value>bbb</value>
                    <value>ccc</value>
                </list>
            </property>
    
        
    <!--        3.map集合依赖注入-->
            <property name="userMap">
                <map>
    <!--                注入两条user对象-->
                    <entry key="user1" value-ref="user1"></entry>
                    <entry key="user2" value-ref="user2"></entry>
                </map>
            </property>
        
        
    <!--        4.properties注入-->
            <property name="properties">
                <props>
                    <prop key="p1">p1</prop>
                    <prop key="p2">p2</prop>
                    <prop key="p3">p3</prop>
                </props>
            </property>
        </bean>
    

分模块配置文件

在 主配置文件 中导入 模块配置文件 即可

<import resource="applicationContext-conduct.xml"/>
<import resource="applicationContext-user.xml"/>

<span>Spring笔记(1)</span>

配置数据源

1.配置pom.xml文件

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.9</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.23</version>
</dependency>

2.配置jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=gyb20010204
jdbc.url=jdbc:mysql://localhost:3306/travel       

2.配置applicationContext-jdbc.xml

对DataSource进行依赖注入

  • <context:property-placeholder location="classpath:jdbc.properties"/>
    
<?xml version="1.0" encoding="UTF-8"?>

<!--此处beans标签下增加一行xmlns:context,但一般太长记不住,可以直接copy第一行的xmlns,
加一个context属性再把beans改成context-->
<!--xsi:schemaLocation下复制一遍地址,把所有beans的地方修改成context-->
<!--这样就算告诉xml我要用spring-context了-->
<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">

    <!--告诉xml,连接池的配置文件在哪-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--开始创建bean对象,类型是DruidDataSource,由于bean对象是默认调用类的无参构造函数,
    所以我们要把DruidDataSource的全类名告诉bean-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

        <!--因为DruidDataSource有setDriverClassName()等此类set函数,我们就可以选择set函数来实现注入-->
        <!--其中name中的内容为属性,也就是set函数中set后面的内容,并把首字母变小写,
        比如setUrl(),那name就是url-->
        <!--value中我们通过spEL来获取到jdbc.properties的值,spEL也就是spring expression language
        类似jsp中的el-->
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
</beans>

3.测试类进行测试

/**
 * 测试spring注入的druid数据源
 */
@Test
public void jdbcTes t01() throws SQLException {
    //获取bean
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    //获取数据源
    DataSource dataSource = app.getBean(DataSource.class);
    //获取连接
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    //关闭连接
    connection.close();

}

spring注解开发

开发步骤

1.在要创建的bean类上添加注解@Component(“id”)

如UserDaoImpl:

//<bean id = "userDao" class="Dao.Impl.UserDaoImpl">
//注解开发,创建bean
@Component("userDao")
public class UserDaoImpl implements UserDao {
...

2.在bean内类注入添加注解@Autowired****
@Qualifier(“id”)****

如在UserServiceImpl内注入UserDaoImpl

//<bean id = "userService" class="Service.Impl.UserServiceImpl">
//注解开发,创建serviceImplBean,引号内相当于id
@Component("userService")
public class UserServiceImpl implements UserService {
    /*在service内注入dao
    <property name="userDao" ref="userDao"></property>*/
    @Autowired
    @Qualifier("userDao")
    //成员变量
    private UserDao userDao;
    ...

3.配置组件扫描,可以扫描文件及其子包

<context:component-scan base-package="Dao"/>
<context:component-scan base-package="Service"/>

报错:** NoSuchBeanDefinitionException,**

原因: 没有进行配置组件扫描

注解说明

1.Spring原始注解(刚开始就有)主要代替Bean的配置

注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层用于实例化Bean
@Service 使用在Service层用于实例化Bean
@Repository 使用在DAO层用于实例化Bean
@Autowired 使用在字段上根据类型依赖注入
@Qualifier 结合@Autowired一起使用根据名称进行依赖注入
@Resource 相当于@Autowired+@Qualifier,安装名称注入
@Value 注入普通属性(配置文件的变量)
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

2.Spring新注解(出来的比原注解晚些)可以加载配置文件,第三方Bean类配置操作

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

集成Junit

步骤

  1. 导入Spring集成Junit的坐标

    <!--    spring测试-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    
  2. 使用@Runwith注解替换原来的运行期

  3. 使用@ContextConfiguration指定配置文件或配置类

  4. 使用@Autowired注入需要测试的对象

  5. 创建测试方法进行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJunitTest {
    @Autowired
    private UserService service;

    @Test
    public void test1(){
        service.save();
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115200.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 怎么看微信撤回的效果?教你看微信已撤回的消息、图片

    怎么看微信撤回的效果?教你看微信已撤回的消息、图片微信小助手故障之后如何实现微信多开和微信防撤回免认证功能呢?这里macw为大家推荐另外一款非常不错微信多开助手微信伴侣WechatTweak,微信伴侣WechatTweak功能就比较简单直接,主要包括防撤回、多开、免二次认证登录和消息处理增强。WeChatTweak小助手集成版安装教程注意!此版本集成了最新版微信!一键安装即可!无需终端!部分读者朋友反映安装了插件之后聊天记录丢失的问题,可以通过迁移聊天记录的方式来解决:执行以下命令即可迁移聊天记录:cp-R~/Library/C

  • TGA文件分析

    TGA文件格式概述【OpenGL】游戏编程常用TGA图像格式详解以及加载纹理编程实现分析TGA格式图片使用FlexHEX打开text.tgatest是用像素笔画出的4*4的图像,第一行为白色和三基色,第四行为三补色和黑色,其余两行为白色打开后可以看到结果十分简单:第一个字节是0,表示没有图像的信息字段第二个字节是0,表示没有颜色表第三个字节总是2,表示此类型为格式2接下来五个字节全为0,可以忽略第九第十个字节为0,表示图像X坐标起始位置为0(最左)第十一、十二个字节为0,表示图

  • 双飞翼布局和圣杯布局

    双飞翼布局和圣杯布局实现左右固定宽度,中间自适应的布局(中间先加载渲染),代码如下<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″/> <title>css</title> </head> <styletype=”text/css”> *…

  • pycharm 2022.01.12 激活[最新免费获取]

    (pycharm 2022.01.12 激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 用HTML+CSS做一个漂亮简单的个人网页

    用HTML+CSS做一个漂亮简单的个人网页1.刚好帮我妹写了一个作业做一个个人网页设计,简单的三个小页面,就从网上随便找了图片自己随便设计了下东拼西凑哈哈哈!!!可能有点low但是对她来说或者需要做简单的个人网站应该就够了吧!图片是从站酷上面找的(因为我不会设计图),如果有侵权了什么的请联系我立刻马上删掉哈!(首页的首屏有下雪了的特效,右下角有音乐播放提示)2.先看一下效果哈!效…

  • Flash停止支持?不用愁!![通俗易懂]

    Flash停止支持?不用愁!![通俗易懂]2020年的最后一天,Flash华丽谢幕与我们告别……作为一名4399的忠实玩家,真是心痛不已……所以,今天告诉大家几种让Flash重新工作的方式:1.安装“中国版Flash”:目前,中国已经

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号