Spring-IoC注解
注解的使用
引入外部的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注解相关推荐
- Spring Ioc注解式开发中注解的作用
Spring Ioc注解式开发中注解的作用 目标:本章节注重于Spring Ioc的注解式开发之中注解的作用. 基于注解的DI实现IOC 1.定义bean而注解 a.@Component @Repos ...
- Spring IOC注解开发
Spring IOC注解开发 @(Spring)[Spring, ioc, 注解] Spring IOC注解开发 Spring的IOC的注解使用步骤 创建项目引入jar包 引入配置文件 创建相关包和类 ...
- 从源码深入理解Spring IoC 注解
全注解下的 Spring IoC 本文基于 Spring Boot,所以并不使用 XML 配置,使用注解描述生成对象 版权声明:本文为博主原创文章,未经博主允许不得转载. Ioc 容器简介 Sprin ...
- Spring5源码 - Spring IOC 注解复习
文章目录 Pre xml配置文件 JavaConfig @CompentScan 在配置类上写@CompentScan注解来进行包扫描 excludeFilters includeFilters @C ...
- Spring IOC注解方式
1.首先要导包 2.导入context名称空间 <?xml version="1.0" encoding="UTF-8"?> <beans x ...
- spring IOC 注解@Autowired
自动装配:按照类型来找 会在xml中找类型一样的, 比如 setMessage(SetName setName)上面有@Autowired,会到xml中找<bean id="setna ...
- Spring:Spring IOC注解方式注册beanDefinition
文章目录 1.美图 2.概述 3.案例 3.1 案例1 4.容器初始化 5.AnnotationConfigApplicationContext 5.1 registerBean 5.1.1 clas ...
- spring ioc的包的扫描(基于注解)
一.包扫描初始步骤源码分析 AnnotationConfigApplicationContext aac =new AnnotationConfigApplicationContext("c ...
- spring IOC基本配置(xml配置和注解配置)
目录 Spring IOC IOC是什么 IOC可以做什么 依赖注入 IOC和DI IOC容器 Bean 配置IOC容器 spring ioc 依赖 XML配置 实例化容器 使用容器 xml配置详解 ...
- Spring常用注解 - 使用注解来构造IoC容器
Spring常用注解 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan b ...
最新文章
- 如何用atom编辑python_Atom运行Python的安装配置步骤和代码范例详解
- 谷歌让AI芯片学会“下崽”,下一代TPU就让AI自己设计
- Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
- 解题代码 用jquery控制一个按钮当一次点击完之后5 秒后才能继续点击 验证码的制作...
- JS关闭窗口兼容Firefox、Chrome、IE(二次总结后)
- Nginx使用openssl生成证书文件
- 打印基于某category创建的所有product
- JAVAIO流经验总结
- Overlay网络技术之vxvlan
- 银行电话营销数据分析
- 【数据库习题原理 10】数据库恢复技术
- Python初学笔记4-【嵌套循环】
- 全国高中生计算机联赛,全国中学生五大学科竞赛
- opentsdb性能测试
- 【计算机网络】第一章:计算机网络概述
- 混合策略纳什均衡——附例题及解析
- 常见的100个推广创意
- 在word中怎么把文字往下挪挪_word流程图中的文字怎样统一调整其大小字...
- 5个最适合开发人员的协作平台
- 【深度学习人类语言处理】3 语音转换——类别(特征分解、直接转换)、语音分离(评价指标、深度聚类、PIT、TaskNet)
热门文章
- sin(ωt),一文和正弦函数、频域、周期的头疼说白白
- 2.某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精设定⦁蛇怪类:属性包括:怪物名字,生命值,攻击力方法包括:攻击,移动(曲线移动),补血(当生命值<10时,可以补加20生命值
- [SCTF 2021]rceme 复现
- excel拆分单元格内容_Excel 快捷键合集
- latex中极限号下边怎么打_latex 极限下标
- Delphi单元文件Unit详解
- 网站服务器iis7.5配置,IIS 7.5 配置伪静态
- ImageSpan 不显示或者变小
- 国美易卡使用HTTP连接方式,国美易卡保证客户端状态
- 【实习日报】2019年6月上半月 前端开发实习工作日报汇总