Spring5学习笔记(五)IOC之xml自动装配、注解开发

举报
Code皮皮虾 发表于 2021/08/22 13:46:35 2021/08/22
【摘要】 Spring5学习笔记(五)IOC之xml自动装配、注解开发

1、引入外部属性文件

导入druid和mysql的jar包,我的mysql版本是8.x的,所以在驱动和url的值上跟5.x版的有所不同,具体值可以百度,很容易搜到。

1. 直接配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
	<property name="url" value="jdbc:mysql://localhost:3306/userDB?serverTimezone=Asia/Shanghai&amp;useSSL=true"></property>
	<property name="username" value="root"></property>
	<property name="password" value="root"></property>
</bean>


@Test
public void test3() throws SQLException {
	DataSource bean = (DataSource)ioc.getBean("dataSource");
	System.out.println(bean.getConnection());
}

连接成功
在这里插入图片描述


2. 引入外部属性文件
创建jdbc.properties配置文件

prop.driverClass=com.mysql.cj.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDB?serverTimezone=Asia/Shanghai&useSSL=true
prop.username=root
prop.password=root

引入context名称空间

xmlns:context="http://www.springframework.org/schema/context"

<!-- 引入jdbc.properties配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

//引入外部属性文件,引入方式value="${配置文件中等号左边的值}"
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
	<property name="driverClassName" value="${prop.driverClass}"></property>
	<property name="url" value="${prop.url}"></property>
	<property name="username" value="${prop.username}"></property>
	<property name="password" value="${prop.password}"></property>
</bean>

连接成功
在这里插入图片描述

2、Spring Bean基于xml装配bean(理解)

property:手动赋值
自动赋值(自动装配,仅限于自定义类型):autowire

  1. autowire=“default/no
  2. autowire=“byName
  3. autowire=“byType
  4. autowire=“constructor

autowire=“default/no”:不自动装配,不自动为car赋值


autowire="byName"

private Car car;

以属性名(car)作为id去容器中找到这个组件,给他赋值:如果找不到就装配null

//id="car"
<bean id="car" class="com.dong.Car">
	<property name="name" value="宝马"></property>
	<property name="color" value="红色"></property>
	<property name="price" value="600000"></property>
</bean>

<bean id="person" class="com.dong.Person" autowire="byName">
</bean>


@Test
public void test2() {
	Person bean2 = ioc.getBean(Person.class);
	System.out.println(bean2);
}

在这里插入图片描述


autowire="byType"

private Car car;

以属性的类型作为查找依据去容器中找到这个组件
car = ioc.getBean(Car.class);

<bean id="person" class="com.dong.Person" autowire="byType">
	</bean>

在这里插入图片描述
如果容器中有多个这个类型的组件,就会报错
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
如果容器中没有,找不到就会赋null


autowire="constructor"

publicPerson(Car car)

按照构造器赋值

  1. 先按照有参构造器参数的类型进行装配(成功就赋值);没有就直接为组件装配为null
  2. 如果按照类型找到了多个;参数的名作为id继续匹配;找到就装配,没有就为null
  3. 不会报错
//构造器
public Person(Car car) {
	super();
	this.car = car;
	System.out.println("可以为Car赋值的有参构造器");
}

3、Bean管理(基于注解方式)

什么是注解?

  1. 注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
  2. 使用注解,注解作用在类上面方法上面属性上面
  3. 使用注解目的:简化xml配置

Spring针对Bean管理中创建对象提供注解

  1. @Component
  2. @Service
  3. @Controller
  4. @Repository

上面四个注解功能是一样的,都可以用来创建bean实例。


3.1、基于注解方式实现对象的创建

第一步:引入依赖
在这里插入图片描述
第二步:开启组件扫描

<!-- 开启组件扫描 -->
<context:component-scan base-package="com.dong"></context:component-scan>

1.如果扫描多个包,多个包使用逗号隔开,
扫描包的上层目录

第三步:创建类,在类上面添加创建对象注释

//在注解里面value属性值可以省略不写,
//默认值是类名称,首字母小写
//使用@Service、@Controller、@Repository效果一样
@Component(value = "userService")  //相当于 <bean id="userService" class="..."></bean>
public class UserService {

	public void add() {
		System.out.println("service add......");
	}
}

测试

@Test
public void test() {
	ApplicationContext ioc = new ClassPathXmlApplicationContext("bean1.xml");
	
	UserService bean = (UserService)ioc.getBean("userService");
	bean.add();
}

在这里插入图片描述


3.1、开启组件扫描细节配置

<!-- 
	use-default-filters="false":表示现在不是用默认filter,自己配置filter
	context:include-filter,设置扫描哪些内容
-->
<context:component-scan base-package="com.dong" use-default-filters="false">
	<!-- 只扫描Controller注解-->
	<context:include-filter type="annotation"
	 expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- 
	context:exclude-filter:设置不扫描哪些内容
-->
<context:component-scan base-package="com.dong" use-default-filters="false">
	<context:exclude-filter type="annotation"
	 expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

3.3、基于注解方式实现属性注入

  1. @AutoWired:根据属性类型进行自动装配
  2. @Qualifier:根据属性名称进行注入
  3. @Resource:可以根据类型注入也可以根据名称注入
  4. @Value:注入普通类型属性

(1)@AutoWired:根据属性类型进行自动装配
步骤

  1. 把service和dao对象创建,在service和dao类添加创建对象注解。
//dao
public interface UserDao {
	public void add();
}

@Repository
public class UserDaoImpl implements UserDao{

	@Override
	public void add() {
		System.out.println("dao add....");
	}
}
  1. 在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
//service
@Service(value = "userService")  //相当于 <bean id="userService" class="..."></bean>
public class UserService {

	//添加Dao类型属性
	//不需要添加set方法
	//添加注入属性注解
	@Autowired //根据类型注入
	private UserDao userDao;
	
	
	public void add() {
		userDao.add();
		System.out.println("service add......");
	}
}

在这里插入图片描述


(2)@Qualifier:根据属性名称进行注入

@Qualifier 和 @AutoWired一起使用

原因: 一个接口可以有多个实现类,这样只使用@AutoWired根据类型注入,无法找到,所以配合使用@Qualifier(value = “xxx”)来指定哪个实现类。

在这里插入图片描述

在这里插入图片描述
执行成功
在这里插入图片描述


(3)@Resource:可以根据类型注入也可以根据名称注入
     1.@Resource根据类型注入
在这里插入图片描述

在这里插入图片描述

     2.@Resource根据名称

在这里插入图片描述
在这里插入图片描述

注意: @Resource:javax.annotation.Resource;
是javax包中的不是spring系列的,spring建议我们使用@Autowired和@Qualifier,但@Resource也是可以做到与其相同的功能的。


@Value:注入普通属性
在这里插入图片描述

在这里插入图片描述


3.4、完全注解开发

(1)创建配置类替代xml配置文件

@Configuration  //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.dong"})  //组件扫描
public class SpringConfig {

}

(2)测试

@Test
	public void test2() {
		ApplicationContext ioc = new AnnotationConfigApplicationContext(SpringConfig.class);
		
		UserService bean = (UserService)ioc.getBean("userService");
		bean.add();
	}

在这里插入图片描述


觉得写的不错的小伙伴,可以点赞关注和收藏哦,博主会持续发布与大家共同学习!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。