spring 注解配置bean2

来源:互联网 发布:dvd播放软件 tn 编辑:程序博客网 时间:2024/06/06 02:00

1.UserService类

package com.hxzy.annotation.service;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;


import com.hxzy.annotation.repository.UserRepository;


//模拟业务层,服务层
@Service
public class UserService {


//autowired可以放在构造器上、属性上、有参数的方法上,以下是将autowired放在属性上
@Autowired
// @Qualifier("userRepositoryImpl") //此处使用Qualifier时,需要修改Test类中的ctx.getBean()中的参数
private UserRepository userRepository;

//autowired放在set方法上(set方法有参数)
// @Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}

public void add() {
System.out.println("UserService add...");
userRepository.save();
}
}


2.UserRepositoryImpl类

package com.hxzy.annotation.repository;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;


import com.hxzy.annotation.TestObject;


//模拟持久化层 //此处的参数("userRepository")如果不写,则接口实现类为两个时(UserRepositoryImpl、 UserJdbcRepository)
//会提示如下错误:.UserRepository] is defined: expected single matching bean but found 2: userJdbcRepository,userRepositoryImpl

@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {


//如果TestObject类中缺少@Component声明,则此处即便使用AutoWired,也会出现BeanCreationException异常
//如果在TestObject类中无@Component声明,此处可以在Autowired中添加参数required=false,使得testObject不被调用,这样就不会报出异常了。

@Autowired(required=false)
private TestObject testObject;


@Override
public void save() {


System.out.println("UserRepository save...");
System.out.println(testObject);

}


}


3.UserJdbcRepository 类

package com.hxzy.annotation.repository;


public class UserJdbcRepository implements UserRepository {


@Override
public void save() {
System.out.println("UserJdbcRepository save");
}


}


4.UserRepository 接口

package com.hxzy.annotation.repository;


public interface UserRepository {


void save();

}


5.UserController 类

package com.hxzy.annotation.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;


import com.hxzy.annotation.service.UserService;


//模拟表现层
@Controller
public class UserController {


//使用注解建立bean与bean之间的引用关系
@Autowired
private UserService userService;

public void execute() {
System.out.println("UserController execute...");
userService.add();
}
}


6.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-4.0.xsd">


    <!-- 指定spring ioc容器扫描的包,
        指定 base-package(基目录) 后,清理工程,则 com.hxzy.annotation包中的所有类被自动扫描,并带有标示s。接口类除外
        指定 resource-pattern ,表示指定扫描的文件为com.hxzy.annotation下repository目录中的所有class文件 -->
<!--  
<context:component-scan
   base-package="com.hxzy.annotation"
   resource-pattern="repository/*.class">
</context:component-scan>
-->

<!--context:exclude-filter : 不包含的包  -->
<!--  
<context:component-scan
   base-package="com.hxzy.annotation">
   <context:exclude-filter type="annotation" 
       expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
-->

<context:component-scan
   base-package="com.hxzy.annotation"
   use-default-filters="true" 
  >
   <!--  只包含指定的包,配置好后,运行无效,需要加use-default-filters="false"
   <context:include-filter type="annotation" 
       expression="org.springframework.stereotype.Repository"/>
       -->
   <!-- 使用全类名的方式指定可使用类 ,此时仅UserRepository类可用   属性use-default-filters=""可不使用 ,若使用需要将值改为false  -->
   <context:include-filter type="assignable" expression="com.hxzy.annotation.repository.UserRepository"/>
 
   
   <!-- 使用全类名方式指定不可使用类,此时仅UserRepository类不可用,注意要删除 use-default-filters="false" 
   <context:exclude-filter type="assignable" expression="com.hxzy.annotation.repository.UserRepository"/>   
   -->
</context:component-scan>

</beans>


7.测试类

package com.hxzy.annotation;


import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;


import com.hxzy.annotation.controller.UserController;
import com.hxzy.annotation.repository.UserRepository;
import com.hxzy.annotation.service.UserService;


public class Test {


public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("annotation.xml");
//使用spring 的默认命名策略,testObject对象是基于TestObject类,将TestObject类的首字母小写,作为bean对象,不在配置文件中专门配置bean
// TestObject to = (TestObject) ctx.getBean("testObject");
// System.out.println(to);
//
// //UserController类的首字母小写,作为bean对象
UserController userControl = (UserController) ctx.getBean("userController");
userControl.execute();
System.out.println(userControl);
//
// UserService userService = (UserService) ctx.getBean("userService");
// System.out.println(userService);

//在UserRepository类中注解若使用@Repository("userRepository"),则此处的ctx.getBean()中参数与注解中的参数相同
//否则若UserRepository类中注解若使用@Repository, 此处ctx.getBean("userRepositoryImpl")
UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
System.out.println(userRepository);

ctx.close();
}
}

0 0
原创粉丝点击