7、Spring之基于注解管理bean
本质上:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行。7.1、环境搭建
创建名为spring_ioc_annotation的新module,过程参考3.1节
7.1.1、创建spring配置文件
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183116134-1371370037.png
7.1.2、创建UserDao接口及实现类
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183319834-573516107.png
package org.rain.spring.dao;
/**
* @author liaojy
* @date 2023/8/5 - 18:32
*/
public interface UserDao {
}https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183411263-438404602.png
package org.rain.spring.dao.impl;
import org.rain.spring.dao.UserDao;
/**
* @author liaojy
* @date 2023/8/5 - 18:33
*/
public class UserDaoImpl implements UserDao {
}7.1.3、创建UserService接口及实现类
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183604303-1899595565.png
package org.rain.spring.service;
/**
* @author liaojy
* @date 2023/8/5 - 18:35
*/
public interface UserService {
}https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183713617-1542329345.png
package org.rain.spring.service.impl;
import org.rain.spring.service.UserService;
/**
* @author liaojy
* @date 2023/8/5 - 18:36
*/
public class UserServiceImpl implements UserService {
}7.1.4、创建UserController
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805183928661-1678214341.png
package org.rain.spring.controller;
/**
* @author liaojy
* @date 2023/8/5 - 18:38
*/
public class UserController {
}7.2、注解和扫描
7.2.1、标识组件的常用注解
注解含义@Component将类标识为普通组件@Controller将类标识为控制层组件@Service将类标识为业务层组件@Repository将类标识为持久层组件@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字
从Spring使用IOC容器管理bean组件的角度来看,这四个组件注解没有区别
@Controller、@Service、@Repository这三个注解只是为了让开发人员便于分辨组件的作用
7.2.2、使用组件注解
7.2.2.1、@Controller注解
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805190502747-805650306.png
package org.rain.spring.controller;
import org.springframework.stereotype.Controller;
/**
* @author liaojy
* @date 2023/8/5 - 18:38
*/
@Controller
public class UserController {
}7.2.2.2、@Service注解
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805190702963-995942925.png
注意:组件注解只能用于实现类,不能用于接口;因为bean的class属性只能是实现类,不能是接口
package org.rain.spring.service.impl;
import org.rain.spring.service.UserService;
import org.springframework.stereotype.Service;
/**
* @author liaojy
* @date 2023/8/5 - 18:36
*/
@Service
public class UserServiceImpl implements UserService {
}7.2.2.3、@Repository注解
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805191002156-1972356296.png
注意:组件注解只能用于实现类,不能用于接口;因为bean的class属性只能是实现类,不能是接口
package org.rain.spring.dao.impl;
import org.rain.spring.dao.UserDao;
import org.springframework.stereotype.Repository;
/**
* @author liaojy
* @date 2023/8/5 - 18:33
*/
@Repository
public class UserDaoImpl implements UserDao {
}7.2.3、扫描组件注解
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805191450405-407274223.png
注意:为了减少扫描的耗时,推荐尽可能精确地指定package
<?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans>7.2.4、测试
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230805192155792-1952943039.png
package org.rain.spring.test;
import org.junit.Test;
import org.rain.spring.controller.UserController;
import org.rain.spring.dao.UserDao;
import org.rain.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author liaojy
* @date 2023/8/5 - 19:18
*/
public class IOCByAnnotationTest {
@Test
public void testAutowireByAnnotation(){
ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
UserController userController = ioc.getBean(UserController.class);
System.out.println(userController);
UserService userService = ioc.getBean(UserService.class);
System.out.println(userService);
UserDao userDao = ioc.getBean(UserDao.class);
System.out.println(userDao);
}
}7.3、高级扫描
7.3.1、排除扫描指定组件
7.3.1.1、方式一:根据注解指定排除(常用)
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806003606674-1823436177.png
<?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans><?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans> 7.3.1.2、方式二:根据类型指定排除
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806003332194-957365184.png
<?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans><?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans> 7.3.2、仅扫描指定组件
7.3.2.1、方式一:根据注解指定包含(常用)
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806005930947-1264833895.png
<?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans><?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans> 7.3.2.2、方式二:根据类型指定包含
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806010203778-589677003.png
<?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans><?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:component-scan base-package="org.rain.spring.controller"></context:component-scan>
<context:component-scan base-package="org.rain.spring.service"></context:component-scan>
<context:component-scan base-package="org.rain.spring.dao"></context:component-scan>
</beans> 7.4、注解组件的id
7.4.1、默认情况
通过注解+扫描所配置的bean的id,默认值为类的小驼峰;即UserController类对应的bean的id就是userController
7.4.2、自定义
可通过标识组件的注解的value属性设置自定义的bean的id
https://img2023.cnblogs.com/blog/2052479/202308/2052479-20230806011551324-1969014717.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]