spring-o1.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">
<!--
1、普通配置扫描
a. base-package 指定Ioc容器去哪些包下查找注解类,让后将这些注解类放到Ioc容器;
b. 可以指定一个或多个包,包之间用逗号隔开,如:com.atguigu.ioc_01,com.atguigu.ioc_02,...
c. 会扫描包的所有子包哦
-->
<context:component-scan base-package="com.atguigu.ioc_01"/>
<!--
2、指定包,但是排除注解
如果你依然用这些包,就会报错:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.atguigu.ioc_01.XxxDao' available
-->
<context:component-scan base-package="com.atguigu.ioc_01">
<!-- 排除包下面的 Repository注解 和 Controller注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
3、指定包,指定包含哪些注解
说一下这里:base-package="com.atguigu",作用是,com.atguigu包下的所有注解都生效,
但是,你下面又指定了只扫描包下的Repository注解,这不就重复了吗,
所以,需要使用use-default-filters="false",让指定包下的注解都先不生效,
这样你里面再指定只扫描哪个注解,不就ok了吗
-->
<context:component-scan base-package="com.atguigu" use-default-filters="false">
<!-- 只扫描包下的Repository注解 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>
src/main/java/com.atguigu.ioc_01/CommonComponent.java
package com.atguigu.ioc_01;
import org.springframework.stereotype.Component;
@Component // 这个注解就相当于你写了个Bean <bean id="commonComponent" class="CommonComponent"
public class CommonComponent {
}
src/main/java/com.atguigu.ioc_01/XxxDao .java
package com.atguigu.ioc_01;
import org.springframework.stereotype.Repository;
@Repository
public class XxxDao {
}
src/main/java/com.atguigu.ioc_01/XxxService .java
package com.atguigu.ioc_01;
import org.springframework.stereotype.Service;
@Service
public class XxxService {
}
src/main/java/com.atguigu.ioc_01/XxxController.java
package com.atguigu.ioc_01;
import org.springframework.stereotype.Controller;
@Controller // 默认id是:xxxController(XxxController类的首字母小写)
// 也可以覆盖哦:@Controller(value="white")
// 可以省略value,像这样:@Controller("white")
public class XxxController {
}
测试类 - SpringIocTest.java
package com.atguigu.test;
import com.atguigu.ioc_01.XxxDao;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringIocTest {
@Test
public void testIoc_01(){
// 1、创建Ioc容器
ClassPathXmlApplicationContext applicationContext
= new ClassPathXmlApplicationContext("spring-01.xml");
// 2、获取组件
XxxDao xxxDao = applicationContext.getBean(XxxDao.class);
System.out.println("XxxDao= " + xxxDao); // XxxDao= com.atguigu.ioc_01.XxxDao@3e2055d6
Object xxxService = applicationContext.getBean("xxxService");
System.out.println("xxxService= " + xxxService); // xxxService= com.atguigu.ioc_01.XxxService@50029372
// 3、close容器
applicationContext.close();
}
}