Spring5自学笔记_Real003(IOC的Bean管理-基于注解的方式)
一、注解
注解是代码的特殊标记。
格式:@注解名称(属性名称=属性值, 属性名称=属性值… …)
使用注释,注释的作用在类上面,方法上面,属性上面等等
使用注解的目的:简化XML配置
二、Spring针对Bean管理中创建对象提供了四个注解:
1、@Component
通用型注解,可以创建所有的普通对象
2、@Service
用于业务逻辑层或者service层上
3、@Controller
一般用在Web层上
4、@Repository
一般用在Dao层上
三、基于注解方式实现对象的创建
第一步:引入依赖
这个jar包在下载的Spring框架压缩包中有,直接引入即可
第二步:开启组件扫面
让系统能够扫面所有的类,然后确定哪些类上面加了注解
第三步:创建类,在类的上方加一个创建对象用的注解即可,就是上述的四个之一。
创建的XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启组件扫描
1、如果要扫描多个包,那么context:component-scan base-package的属性值就可以用逗号隔开
2、如果包在同一个目录下,则直接写到父目录即可
-->
<context:component-scan base-package="com.SSMStudy.Spring5.AnnotationSpringStudy"></context:component-scan>
</beans>
需要创建对象的类
import org.springframework.stereotype.Component;
//在注解里面的value属性值可以省略不写
//默认值就是类名的首字母小写
@Component(value="userService")
public class UserService {
public void add(){
System.out.println("service add... ...");
}
}
测试:
import com.SSMStudy.Spring5.AnnotationSpringStudy.Service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAnnotationTest {
@Test
public void Test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
运行结果:
service add... ...
四、开启组件扫描的一些细节配置
<!-- 示例1
use-default-filters="false" 表示现在不适用默认的filter扫描器及逆行扫描,我们自己配置扫描器
<context:include-filter 设置扫描哪些内容,type是按照什么类型进行扫描,expression表示具体的类型的包文件路径
-->
<context:component-scan base-package="com.SSMStudy.Spring5.AnnotationSpringStudy" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 示例2
filter默认是扫描路径下全部的类
但是加上context:exclude-filter标签之后,就是设置哪些类型不扫描,type表示不扫描的类型,expression表示不扫描的类型的具体路径
-->
<context:component-scan base-package="com.SSMStudy.Spring5.AnnotationSpringStudy">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
五、基于注解方式的属性的注入
(一)Spring提供的用于属性注入的注解
1、@Autowired:根据属性类型进行自动装配
2、@Qualifier:根据属性名称进行注入
3、@Resource:可以根据类型注入,可以根据名称注入
4、@Value:注入普通类型属性
1、@Autowired:根据属性类型进行自动装配
public interface UserDao {
void add();
}
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImp implements UserDao{
@Override
public void add() {
System.out.println("UserDao add......");
}
@Override
public String toString() {
return "UserDaoImp{}";
}
}
import com.SSMStudy.Spring5.AnnotationSpringStudy.Dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//在注解里面的value属性值可以省略不写
//默认值就是类名的首字母小写
@Service
public class UserService {
/**
* 定义dao类型属性
* 不需要添加set方法
* 添加注入属性注解
*/
@Autowired
private UserDao userDao;
public void add(){
System.out.println("service add... ...");
userDao.add();
}
@Override
public String toString() {
return "UserService{" +
"userDao=" + userDao +
'}';
}
}
/**
*测试程序
*/
import com.SSMStudy.Spring5.AnnotationSpringStudy.Service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAnnotationTest {
@Test
public void Test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.add();
System.out.println(userService);
}
}
运行结果:
service add... ...
UserDao add......
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启组件扫描
1、如果要扫描多个包,那么context:component-scan base-package的属性值就可以用逗号隔开
2、如果包在同一个目录下,则直接写到父目录即可
-->
<context:component-scan base-package="com.SSMStudy.Spring5.AnnotationSpringStudy"></context:component-scan>
</beans>
2、@Qualifier:根据属性名称进行注入
@Qualifier注解的使用,需要和上面@Autowired一起使用
应用场景:有的时候,我们在类中定义的属性是一个接口,但是该接口有很多个实现类,那么如何在属性注入的时候确定是哪个实现类呢?这时候就用@Qualifier注解,在这个注解中有一个value属性,这个属性的属性值必须和实现那个特定实现类的注解的属性名是一致的。
public interface UserDao {
void add();
}
@Repository(value = "userDaoImp1")
public class UserDaoImp implements UserDao{
@Override
public void add() {
System.out.println("UserDao add......");
}
@Override
public String toString() {
return "UserDaoImp{}";
}
}
@Service
public class UserService {
/**
* 定义dao类型属性
* 不需要添加set方法
* 添加注入属性注解
*/
@Autowired
@Qualifier(value = "userDaoImp1")
private UserDao userDao;
@Override
public String toString() {
return "UserService{" +
"userDao=" + userDao +
'}';
}
}
3、@Resource:可以根据类型注入,可以根据名称注入
整合了Autowired和Qualifier两个注解的用法,通过类型注入和通过名称注入都可以进行
4、@Value:注入普通类型属性
@Value(value = "abc")
private String name;
六、完全注解开发(不用XML配置文件)
1、创建配置类,用于替代配置文件
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //添加configuration注解,作为配置类,用于替代xml配置文件
@ComponentScan(basePackages = "com.SSMStudy.Spring5.AnnotationSpringStudy")
public class SpringConfig {
}
2、创建测试类:在测试类中编写测试方法
@Test
public void Test02(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
3、运行结果:
service add... ...
UserDao add......