【Spring框架05】Bean使用补充
思维导图
一、Spring IOC容器自动扫描管理bean
对于不确定所属于那层,可以使用:@Component
1.Dao层:@Repository
@Repository
public class UserDao {
public void add(){
System.out.println("UserDao>>>>>>>>>>>");
}
}
2.Service层:@Service
@Service
public class UserService {
@Resource
private UserDao userDao;
public void test() throws Exception{
userDao.add();
}
}
关于context.getBean默认(“当前类名小写”)
public class UserServiceTest {
@Test
public void test01() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();
}
}
3.视图控制层:@Controller
@Controller("lcy")
public class UserController {
@Autowired
private UserService userService;
public void test() throws Exception {
userService.test();
}
}
在插入注解的时候自定义,测试中context.getBean调用定义的名字
public class UserServiceTest {
@Test
public void test02() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserController userController = (UserController)context.getBean("lcy");
userController.test();
}
}
4.配置spring.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
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 包扫描目录下的所有bean对象-->
<context:component-scan base-package="com.lcySpring"/>
</beans>
二、模拟用户登录流程
1.基本的框架配置
2.定义用户信息java类
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.dao:验证用户密码是否准确
@Repository
public class UserDao {
private final String USERNAME="lmr";
private final String PASSWORD="lcy";
public User queryUserByName(String username){
if(username==null||username==""){
return null;
}
else {
if(username.equals(USERNAME)){
User user=new User();
user.setPassword(PASSWORD);
user.setUsername(USERNAME);
return user;
}
else {
return null;
}
}
}
}
3.service:根据传入的用户名和密码进行格式判断并调用dao验证
@Service("aaa")
public class UserService {
@Resource
public UserDao userDao;
public String login(String username,String password) throws Exception{
if(username==null||"".equals(username)){
return "用户名为空";
}
if(password==null||"".equals(password)){
return "密码为空";
}
User user = userDao.queryUserByName(username);
if(user==null){
return "用户不存在";
}
else{
if(password.equals(user.getPassword())){
return "登入成功";
}
else {
return "登入失败";
}
}
}
}
4.spring.xml中包扫描目录下的所有bean对象
<?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
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 包扫描目录下的所有bean对象-->
<context:component-scan base-package="com.lcySpring"/>
</beans>
5.测试java类,进行用户登录模拟
public class UserServiceTest {
@Test
public void login() throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService)context.getBean("aaa");
String login =userService.login("lmr","lcy");
System.out.println(login);
}
}
三、Bean作用域
1.判断是否是单例
public class SpringScopeTest {
@Test
public void test01(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
System.out.println(context.isSingleton("aaa"));
}
}
2.可以通过修改xml文件中bean标签的scope进行修改
<?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
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 包扫描目录下的所有bean对象-->
<context:component-scan base-package="com.lcySpring"/>
<bean id="userService" class="com.lcySpring.service.UserService" scope="prototype"></bean>
</beans>
3.也可以通过标签设置
@Service("aaa")
@Scope("prototype")
4.设置懒加载
用到的时候调用就好了
<bean id="userService" class="com.lcySpring.service.UserService" lazy-init="true"></bean>
四、Bean的生命周期
1.初始化监听
(1)在配置文件中通过指定init-method属性来完成
<!-- 监听并创建-->
<bean id="accountDao" class="com.lcySpring.dao.AccountDao" init-method="init"></bean>
这里的init对应的是AccountDao中初始化的方法名
public class AccountDao implements InitializingBean {
public void init(){
System.out.println("AccountDao>>>>>>>>>>>>>>>>>init");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("AccountDao>>>>>>>>>>>>>>>>>init");
}
}
(2)实现org.springframework.beans.factory.InitializingBean接口
public class AccountDao implements InitializingBean {}
2.销毁
(1)destroy-method=“destroy”
在xml文件中配置
<bean id="accountDao" class="com.lcySpring.dao.AccountDao" destroy-method="destroy"></bean>
(2)需要一个抽象的环境AbstractApplicationContext
设置测试类
public class AccountDaoTest {
@Test
public void test01() throws Exception{
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
AccountDao accountDao = (AccountDao)context.getBean("accountDao");
context.close();
}
}