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&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
- autowire=“default/no”
- autowire=“byName”
- autowire=“byType”
- 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)
按照构造器赋值
- 先按照有参构造器参数的类型进行装配(成功就赋值);没有就直接为组件装配为null
- 如果按照类型找到了多个;参数的名作为id继续匹配;找到就装配,没有就为null
- 不会报错
//构造器
public Person(Car car) {
super();
this.car = car;
System.out.println("可以为Car赋值的有参构造器");
}
3、Bean管理(基于注解方式)
什么是注解?
- 注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
- 使用注解,注解作用在类上面、方法上面、属性上面。
- 使用注解目的:简化xml配置
Spring针对Bean管理中创建对象提供注解
- @Component
- @Service
- @Controller
- @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、基于注解方式实现属性注入
- @AutoWired:根据属性类型进行自动装配
- @Qualifier:根据属性名称进行注入
- @Resource:可以根据类型注入也可以根据名称注入
- @Value:注入普通类型属性
(1)@AutoWired:根据属性类型进行自动装配
步骤:
- 把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....");
}
}
- 在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();
}
觉得写的不错的小伙伴,可以点赞关注和收藏哦,博主会持续发布与大家共同学习!
- 点赞
- 收藏
- 关注作者
评论(0)