注解的使用

引入外部的properties文件

首先创建配置文件

创建beans6.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"><bean id="druid" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/maclu"></property><property name="username" value="root"></property><property name="password" value="123456"></property></bean>
</beans>

测试

    @Testpublic void Tses15(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans6.xml");DruidDataSource druid = context.getBean("druid", DruidDataSource.class);DruidPooledConnection connection = null;try {connection = druid.getConnection();System.out.println(connection);} catch (SQLException e) {e.printStackTrace();}finally {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}

结果

或者先添加druid的pom依赖

   <!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>

创建beans7.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"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 https://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:db.properties"></context:property-placeholder><bean id="druid" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean>
</beans>

结果

依赖注入

1)Spring配置文件引入context约束

<?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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:c="http://www.springframework.org/schema/c"xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"></beans>

2)Spring配置文件中开启注解扫描

<?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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:c="http://www.springframework.org/schema/c"xmlns:util="http://www.springframework.org/schema/util"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"><context:component-scan base-package="com.cqucc" /></beans>

在classpath中的扫描组件:component-scan,他能够在classpath中自动扫描,自动检查和实例化具有特定注解的组件。

特定组件包括

  • @Component :组件通用注解,标识一个受Spring管理的组件
  • @Controller :常用于对表现标注
  • @Service:常用于对服务层(业务层)标注
  • @Repository:常用于对持久层标注

@Component、@Controller、@Service和@Repository功能一样,可以互换,我们使用不同注解主要为了区分被注解的类处在不同的业务层,使逻辑更加清晰。

它们使用方法:

(1)标注在类上

(2)@Component("name")等于@Component(value="user")

(3)@Component相当于@Component("className")

3)案例

Users类

package com.cqucc.pojo;import org.springframework.stereotype.Component;@Component
public class Users {private Integer userid;private String usernama;private String password;public Users (){System.out.println("这是无参构造方法");}public Users(Integer userid, String usernama, String password) {System.out.println("这是有参构造方法");this.userid = userid;this.usernama = usernama;this.password = password;}public void say(){System.out.println("hello");}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsernama() {return usernama;}public void setUsernama(String usernama) {this.usernama = usernama;}public Integer getUserid() {return userid;}public void setUserid(Integer userid) {this.userid = userid;}@Overridepublic String toString() {return "Users{" +"userid=" + userid +", usernama='" + usernama + '\'' +", password='" + password + '\'' +'}';}
}

编写测试类:

      @Testpublic void Tses(){ApplicationContext act = new ClassPathXmlApplicationContext("beans8.xml");Users users = act.getBean(Users.class);Users users2 = act.getBean("users",Users.class);System.out.println(users);System.out.println(users2);}

测试结果

注:在注解中value属性值可以省略不写,

    @Testpublic void Tses17(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans8.xml");DeptAction deptAction =  context.getBean(DeptAction.class);System.out.println(deptAction);deptAction.show();DeptService deptService = context.getBean(DeptService.class);System.out.println(deptService);deptService.show();DeptDao deptDao =  context.getBean(DeptDao.class);System.out.println(deptDao);}

,首字母小写

4)属性注入

4.1@Autowired

自动注入的方式进行注入,默认根据类的名称来进行装配

DeptDao类

package com.cqucc.dao;import org.springframework.stereotype.Repository;@Repository
public class DeptDao {public void show(){System.out.println("dept执行了");}
}

DeptService 类

package com.cqucc.service;import com.cqucc.dao.DeptDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class DeptService {@Autowiredprivate DeptDao deptDao;public void show(){System.out.println("service执行了");deptDao.show();}
}

DeptAction 类

package com.cqucc.action;import com.cqucc.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class DeptAction {@Autowiredprivate DeptService deptService;public void show(){System.out.println("action执行了");deptService.show();}
}

测试类

    @Testpublic void Tses17(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans8.xml");DeptAction deptAction =  context.getBean(DeptAction.class);System.out.println(deptAction);deptAction.show();DeptService deptService = context.getBean(DeptService.class);System.out.println(deptService);deptService.show();DeptDao deptDao =  context.getBean(DeptDao.class);System.out.println(deptDao);}

测试结果

@Autowired注意事项:

默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。

如去掉DeptAction 类中的的@Autowired时

package com.cqucc.action;import com.cqucc.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class DeptAction {private DeptService deptService;public void show(){System.out.println("action执行了");deptService.show();}
}//测试方法@Testpublic void Tses17(){ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans8.xml");DeptAction deptAction =  context.getBean(DeptAction.class);System.out.println(deptAction);deptAction.show();}

测试结果

4.2 @Qualifier

@Autowired是按照类型进行匹配,如果当前@Autowired标注的依赖在容器中只能找到一个实例一致对应的话,那还好。可是,要是能够同时找到多个或者同一类型的对象实例,那该怎么办?可以使用@Qualifier对依赖注入的条件做进一步限定。如下

定义接口

package com.cqucc.dao;public interface DeptDaoInter {public void show();
}

实现接口的两个类

package com.cqucc.dao.Impl;import com.cqucc.dao.DeptDaoInter;
import org.springframework.stereotype.Repository;@Repository
public class DeptDao implements DeptDaoInter {public void show(){System.out.println("dept执行了");}
}
package com.cqucc.dao.Impl;import com.cqucc.dao.DeptDaoInter;
import org.springframework.stereotype.Repository;@Repository
public class DeptDao1 implements DeptDaoInter {public void show(){System.out.println("dept1执行了");}
}

测试类

    @Testpublic void test18(){ApplicationContext context = new ClassPathXmlApplicationContext("beans9.xml");DeptService deptService = context.getBean(DeptService.class);System.out.println(deptService);}

结果:

当添加 @Qualifier("deptDao1")后

package com.cqucc.service;import com.cqucc.dao.DeptDaoInter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Service
public class DeptService {@Autowired@Qualifier("deptDao1")private DeptDaoInter deptDaoInter;public void show(){System.out.println("service执行了");deptDaoInter.show();}
}

测试结果

4.3 @Resource

@Resource(name = "deptDao1")相当于@Autowired+@Qualifier("name")

package com.cqucc.service;import com.cqucc.dao.DeptDaoInter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service
public class DeptService {
//    @Autowired
//    @Qualifier("deptDao1")@Resource(name = "deptDao1")private DeptDaoInter deptDaoInter;public void show(){System.out.println("service执行了");deptDaoInter.show();}
}

测试结果

5)包含(不包含)组件

<context:component-scan>提供了两个子标签

  • <context:include-filter>
  • <context:exclude-filter>

在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有Spring注解的类,并注册成bean。也就是@Component,@Controller,@Service,@Reposity等。所以如果仅仅是在配置文件中这么写

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

use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。

可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示

        <context:component-scan base-package="com.cqucc" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>

这样就会只扫描base-package包或者子包下所有@Controller下的java类,并注册成bean。

去访问除了@Controller以为的类会包下面的错误

如果不想扫描指定包下面的Controller时,需要使用<context:exclude-filter>标签

    <context:component-scan base-package="com.cqucc"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>

去访问@Controller以为的类会包下面的错误

6)无配置注解

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

@Configuration不可以是final类型;
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。

如下:

package com.cqucc.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.cqucc"})
public class SpringConfig {public SpringConfig(){System.out.println("容器启动初始化...");}
}

测试类

    @Testpublic void test20(){ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);DeptAction action = context.getBean(DeptAction.class);System.out.println(action);action.show();}

结果

Spring-IoC注解相关推荐

  1. Spring Ioc注解式开发中注解的作用

    Spring Ioc注解式开发中注解的作用 目标:本章节注重于Spring Ioc的注解式开发之中注解的作用. 基于注解的DI实现IOC 1.定义bean而注解 a.@Component @Repos ...

  2. Spring IOC注解开发

    Spring IOC注解开发 @(Spring)[Spring, ioc, 注解] Spring IOC注解开发 Spring的IOC的注解使用步骤 创建项目引入jar包 引入配置文件 创建相关包和类 ...

  3. 从源码深入理解Spring IoC 注解

    全注解下的 Spring IoC 本文基于 Spring Boot,所以并不使用 XML 配置,使用注解描述生成对象 版权声明:本文为博主原创文章,未经博主允许不得转载. Ioc 容器简介 Sprin ...

  4. Spring5源码 - Spring IOC 注解复习

    文章目录 Pre xml配置文件 JavaConfig @CompentScan 在配置类上写@CompentScan注解来进行包扫描 excludeFilters includeFilters @C ...

  5. Spring IOC注解方式

    1.首先要导包 2.导入context名称空间 <?xml version="1.0" encoding="UTF-8"?> <beans x ...

  6. spring IOC 注解@Autowired

    自动装配:按照类型来找 会在xml中找类型一样的, 比如 setMessage(SetName setName)上面有@Autowired,会到xml中找<bean id="setna ...

  7. Spring:Spring IOC注解方式注册beanDefinition

    文章目录 1.美图 2.概述 3.案例 3.1 案例1 4.容器初始化 5.AnnotationConfigApplicationContext 5.1 registerBean 5.1.1 clas ...

  8. spring ioc的包的扫描(基于注解)

    一.包扫描初始步骤源码分析 AnnotationConfigApplicationContext aac =new AnnotationConfigApplicationContext("c ...

  9. spring IOC基本配置(xml配置和注解配置)

    目录 Spring IOC IOC是什么 IOC可以做什么 依赖注入 IOC和DI IOC容器 Bean 配置IOC容器 spring ioc 依赖 XML配置 实例化容器 使用容器 xml配置详解 ...

  10. Spring常用注解 - 使用注解来构造IoC容器

    Spring常用注解 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan b ...

最新文章

  1. 如何用atom编辑python_Atom运行Python的安装配置步骤和代码范例详解
  2. 谷歌让AI芯片学会“下崽”,下一代TPU就让AI自己设计
  3. Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
  4. 解题代码 用jquery控制一个按钮当一次点击完之后5 秒后才能继续点击 验证码的制作...
  5. JS关闭窗口兼容Firefox、Chrome、IE(二次总结后)
  6. Nginx使用openssl生成证书文件
  7. 打印基于某category创建的所有product
  8. JAVAIO流经验总结
  9. Overlay网络技术之vxvlan
  10. 银行电话营销数据分析
  11. 【数据库习题原理 10】数据库恢复技术
  12. Python初学笔记4-【嵌套循环】
  13. 全国高中生计算机联赛,全国中学生五大学科竞赛
  14. opentsdb性能测试
  15. 【计算机网络】第一章:计算机网络概述
  16. 混合策略纳什均衡——附例题及解析
  17. 常见的100个推广创意
  18. 在word中怎么把文字往下挪挪_word流程图中的文字怎样统一调整其大小字...
  19. 5个最适合开发人员的协作平台
  20. 【深度学习人类语言处理】3 语音转换——类别(特征分解、直接转换)、语音分离(评价指标、深度聚类、PIT、TaskNet)

热门文章

  1. sin(ωt),一文和正弦函数、频域、周期的头疼说白白
  2. 2.某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精设定⦁蛇怪类:属性包括:怪物名字,生命值,攻击力方法包括:攻击,移动(曲线移动),补血(当生命值<10时,可以补加20生命值
  3. [SCTF 2021]rceme 复现
  4. excel拆分单元格内容_Excel 快捷键合集
  5. latex中极限号下边怎么打_latex 极限下标
  6. Delphi单元文件Unit详解
  7. 网站服务器iis7.5配置,IIS 7.5 配置伪静态
  8. ImageSpan 不显示或者变小
  9. 国美易卡使用HTTP连接方式,国美易卡保证客户端状态
  10. 【实习日报】2019年6月上半月 前端开发实习工作日报汇总