Java web开发(15)Spring入门介绍
IOC入门案例
有User类
public class User { public void add() { System.out.println("add.........."); } }
在Spring的配置文件bean1.xml中如下配置
<bean id="user" class="cn.itcast.ioc.User"></bean>
如下使用
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); User user=(User)context.getBean("user"); System.out.println(user); user.add();
Bean的标签:scope
<bean id="user" class="cn.itcast.ioc.User" scope="prototype"></bean>
如果不配置scope默认为singleton
属性注入
有参构造注入
比如类PropertyDemo1,有属性username
private String username; //有参构造函数 public PropertyDemo1(String username){ this.username=username; }
通过如下配置为其注入属性
<bean id="demo" class="cn.itcast.property.PropertyDemo1"> <constructor-arg name="hello" value="小王小马"></constructor-arg> </bean>
Set方法注入对象类型属性
有类UserService
public class UserService { //1 定义dao类型属性 private UserDao userDao; //2 生成set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service........."); userDao.add(); } }
<!-- 1 配置service和dao对象 --> <bean id="userDao" class="cn.itcast.ioc.UserDao"></bean> <bean id="userService" class="cn.itcast.ioc.UserService"> <property name="userDao" ref="userDao"></property> </bean>
name :UserService中UserDao属性名称
ref,UserDao类在bean中的id值。
Autowired介绍
使用@Autowired注解的过程中,如果出现NoUniqueBeanDefinitionException异常,大多是因为自动装配或者其他方式装配所导致的歧义性.即一个接口存在两个以上的实现类.即在自动装配的时候,可能出现因重名问题导致的NoUniqueBeanDefinitionException异常.
@Autowired是按类型进行装配的,那么我一个接口UserInterface,有多个实现类
AImpl(@service(name="userInterface1")),BImpl(@service(name="userInterface2")
等等这些实现类都加入了Spring容器,当在一个类中使用如下语句:
@Autowired
private IUserInterface userInterface;
在下面列举一下了一下,上述问题以及类似的装配歧义性解决问题方法.
方法一
首先加上注解@Qualifier来区分不同的实例.通过在实现接口的类上通过value属性去命名不同的名称,对于@Repository、@Service 和 @Controller 和 @Component四个注解都有类似value属性可以设置,例如:
@Service(value="userServiceImpl")
public class UserServiceImpl implements IUserService{
}
@Autowired
@Qualifier("userServiceImpl")
private IUserService userServiceImpl;
方法二
因为一个借口存在两个以上的实现类,也可以通过标识首选哪个bean,来解决歧义性问题.例如:
@Component
@Primary
public class UserServiceImpl implements IUserService{
}
此时,如果引用到了IUserService接口的实现类注入,则首先注入@Promary注解标注的类,但是此时有一个问题,在同一个接口的实现类中,你只能使用一次@Primary,如果对于AImpl和BImpl都使用了@primary,则还是会发生装配的歧义性.此时,建议使用(1)的方式来解决歧义性问题.
注解开发
目的:使用注解的方式替代bean配置
比如,上面的User可以改成如下
@Component(value="user") public class User{ ..... }
说明:这个注解就等效于
<bean id="user" class="....">
Component,Service都是一个意思。
配置:在原来配置bean的文件中使用
<context:component-scan base-package="cn.itcast"></context:component-scan>
base-package可以学包名,也可以是开头为cn.itcast的所有包。
注解方式使用事务
<!-- 第一步配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 第二步 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
在需要使用事务的方法上面使用@Transactional
注解方式注入属性
上面的UserService,不使用配置,使用注解改写成
@Component(value="id_of_dao") public class UserDao { public void add() { System.out.println("dao........."); } } @Service(value="userService") public class UserService {
//这里可以使用@Autowired @Resource(name="id_of_dao") private UserDao db; public void add() { System.out.println("service..........."); db.add(); } } // 测试代码 @Test public void testService() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = (UserService) context.getBean("userService"); userService.add(); } //输出 service........... dao........