一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
IOC操作Bean管理(xml自动装配)
在上面的我们xml的装配都说手动装配
什么是自动装配
- 根据指定装配规则(属性名称或者属性类型)Spring自动将匹配的属性值进行注入
bean标签属性autowire,配置自动装配 autowire属性常用两个值: byName根据属性名称注入 注入值bean的id值和类属性名称一样 byType更具属性类型注入--属性类型 下面是ByName和byType
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--自动装配
bean标签属性autowire,配置自动装配
autowire属性常用两个值:
byName根据属性名称注入 注入值bean的id值和类属性名称一样
byType更具属性类型注入
-->
<bean id="emp2" class="com.Spring.autowire.Emp" autowire="byName">
<!--<bean id="emp2" class="com.Spring.autowire.Emp" autowire="byType">-->
<!--<property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.Spring.autowire.Dept"></bean>
</beans>
@Autowired与@Resource异同:
- @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
- @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果 要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我 们想使用名称装配可以结合@Qualifier注解进行使用
- @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果 没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在 setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是 需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。 它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先 byName。
1.IOC操作Bean管理(外部属性文件)
1.配置数据库信息
-
1.配置德鲁伊连接池
内部创建信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--配置数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://loaclhost/user" ></property>
<property name="username" value="root" ></property>
<property name="password" value="" ></property>
</bean>
</beans>
外部创建文件jabc.properties文件进行数据库的连接
再把外部properties文件属性引入到Spring配置文件中 引入context
<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">
进行属性的接入
<?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">
<!--引入外部属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}"></property>
<property name="url" value="${prop.url}" ></property>
<property name="username" value="${prop.userName}" ></property>
<property name="password" value="${prop.password}" ></property>
</bean>
</beans>
2.IOC操作Bean管理(基于注解)
1.什么是注解 注解是代码特殊标记、格式:@注解名称(属性名称=属性值) 使用注解,注解在作用在类上面、方法上面、属性上面,位置不一样,作用范围不一样 使用注解的目的:简化xml配置 2.Spring针对Bean管理中创建对象提供注解
- @Component
- @Service
- @Controller
- @Repository
上面的四个注解功能一样,都可以用来创建Bean实例
我们这些注解,就是替代了在配置文件当中配置步骤而已!更加的方便快捷!
- @Component三个衍生注解 为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
- @Controller:web层
- @Service:service层
- @Repository:dao层 写上这些注解,就相当于将这个类交给Spring管理装配了!
1.基于注解方式实现对象创建
1.引入依赖引入Spring的AOPjar包
2.开启xml的组件扫描xml里面需要配置context
<?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">
<!--开启组件扫描
如果扫描多个包用逗号隔开
扫描包上层目录
-->
<context:component-scan base-package="com.Spring.service,com.Spring.dao"></context:component-scan>
</beans>
实现类,可以将@的四个都可以实现
import org.springframework.stereotype.Component;
//value可以不写,不写的话就默认类名的首字母小写
@Component(value="userService") //<bean id="userService" class="">
public class UserService {
public void add(){
System.out.println("service add...");
}
}
测试代码
@Test
public void testService(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
UserService service = context.getBean("userService",UserService.class);
System.out.println(service);
service.add();
}
限制扫描的范围
<?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">
<!--开启组件扫描
如果扫描多个包用逗号隔开
扫描包上层目录
-->
<context:component-scan base-package="com.Spring.service,com.Spring.dao"></context:component-scan>
<!-- 实例一限制扫描的范围
use-default-filters="false"表示现在不使用默认filter,自己配置filter
context:include-filter设置扫描那些内容
expression="org.springframework.stereotype.Controller"只扫描Controller这个方式
-->
<context:component-scan base-package="com.Spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--示例二
下面配置扫描包所有内容
context:exclude-filter:设置那些内容不扫描
-->
<context:component-scan base-package="com.Spring">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>
2.基于注解方式实现属性注入
- @AutoWired :根据属性类型进行自动装配 实现:把Service和dao对象创建,在Service和dao类田间创建对象
public class UserService {
@Autowired
private UserDao userDao;
public void add() {
System.out.println("add Service....");
userDao.add();
}
}
@Repository
public class UserDaoImpl implements UserDao {
public void add() {
System.out.println("dao add....");
}
}
public interface UserDao {
public void add();
}
<?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">
<!--开启组件扫描
如果扫描多个包用逗号隔开
扫描包上层目录
-->
<context:component-scan base-package="com.Spring.service,com.Spring.dao"></context:component-scan>
</beans>
@Test
public void testService(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml");
UserService service = context.getBean("userService",UserService.class);
service.add();
}
-
@Qualifier :根据属性名称进行注入
@Service
public class UserService {
@Autowired//根据类型注入
@Qualifier(value = "userDaoImpl")//根据名称注入
private UserDao userDao;
public void add() {
System.out.println("add Service....");
userDao.add();
}
}
- @Resource :可以根据类型注入,也可以根据名称注入
@Service
public class UserService {
//@Resource//根据类型注入
@Resource(name = "userDaoImpl1") //根据名称注入
private UserDao userDao;
public void add() {
System.out.println("add Service....");
userDao.add();
}
}
- @Value:注入普通类型属性
@Service
public class UserService {
private UserDao userDao;
@Value(value = "张三")
private String name;
public void add() {
System.out.println("add Service"+name);
}
}
. 可以不用提供set方法,直接在直接名上添加@value("值")
@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
@Value("秦疆")
// 相当于配置文件中 <property name="name" value="秦疆"/>
public String name;
}
.如果提供了set方法,在set方法上添加@value("值");
@Component("user")
public class User {
public String name;
@Value("秦疆")
public void setName(String name) {
this.name = name;
}
}
3.完全注解开发
1.创建配置类,替代xml配置文件
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = ("com.Spring")) //加上路径
public class SpringConfig {
}
实现配置类
@Test
public void test(){
//加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
}