프로그램 해상도 결합 사상,spring IOC,DI
결합성(Coupling)은 결합도라고도 부르며 모듈 간의 연관 정도에 대한 도량이다.결합의 강약은 모듈 간 인터페이스의 복잡성, 모듈을 호출하는 방식과 인터페이스를 통해 데이터를 얼마나 전송하는지에 달려 있다.모듈 간의 결합도는 모듈 간의 의존 관계를 가리키며 제어 관계, 호출 관계, 데이터 전달 관계를 포함한다.모듈 간의 연결이 많을수록 결합성이 강하고 독립성이 떨어진다는 것을 나타낸다(결합성을 낮추면 독립성을 높일 수 있다).결합성은 소프트웨어 디자인에서만 있는 것이 아니라 각 분야에 존재하지만 우리는 소프트웨어 공학에서의 결합만 논의한다.소프트웨어 공학에서 결합은 바로 대상 간의 의존성을 가리킨다.대상 간의 결합이 높을수록 유지 보수 원가가 높다.따라서 대상의 디자인은 클래스와 부품 간의 결합을 최소화해야 한다.소프트웨어 디자인에서는 일반적으로 결합도와 내집도를 모듈의 독립 정도를 평가하는 표준으로 한다.모듈을 구분하는 하나의 준칙은 바로 고내중 저결합이다.
프로그램의 결합
결합: 프로그램 간의 의존 관계
클래스 간의 의존, 방법 간의 의존
해결: 프로그램 간의 의존 관계를 낮추다
실제 개발 중: 컴파일링 기간이 의존하지 않고 실행할 때 의존해야 한다.
해결 방법:
첫 번째 단계: 새 키워드를 사용하지 않고 반사로 대상을 만듭니다.
2단계: 프로필을 읽어서 만들 대상의 한정된 클래스 이름을 가져옵니다
예를 들어, DriverManager를 사용합니다.registerDriver(new com.mysql.jdbc.Driver()); 문장, 대응하는 의존이 없으면 컴파일링 기간에 이상을 보고할 수 있으며, 모든Class를 사용합니다.forName("com.mysql.jdbc.Driver"); 설정 파일을 반사적으로 읽어서 결합도를 낮추다
public class JdbcDemo1 {
public static void main(String[] args) throws Exception{
//1.
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//Class.forName("com.mysql.jdbc.Driver");
//2.
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/eesy","root","1234");
//3.
PreparedStatement pstm = conn.prepareStatement("select * from account");
//4. SQL,
ResultSet rs = pstm.executeQuery();
//5.
while(rs.next()){
System.out.println(rs.getString("name"));
}
//6.
rs.close();
pstm.close();
conn.close();
}
}
다음 코드, private IaccountDao accountDao = new AccountDao Impl ().만약dao층에 대응하는 실현 클래스가 없다면 컴파일링 시 이상이 발생하고 프로그램 결합도가 높으며 건장하지 못합니다
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao = new AccountDaoImpl();
//private IAccountDao accountDao = (IAccountDao)BeanFactory.getBean("accountDao");
// private int i = 1;
public void saveAccount(){
int i = 1;
accountDao.saveAccount();
System.out.println(i);
i++;
}
}
우선properties 파일을 설정합니다
accountService=com.itheima.service.impl.AccountServiceImpl
accountDao=com.itheima.dao.impl.AccountDaoImpl
/**
* Bean
*
* Bean: , 。
* JavaBean: java 。
* javabean >
*
* service dao 。
*
* : service dao
* : = (key=value)
* : ,
*
* xml properties
*/
public class BeanFactory {
// Properties
private static Properties props;
// Properties
static {
try {
//
props = new Properties();
// properties
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
}
}catch(Exception e){
throw new ExceptionInInitializerError(" properties !");
}
}
public static Object getBean(String beanName){
Object bean = null;
try {
String beanPath = props.getProperty(beanName);
System.out.println(beanPath);
bean = Class.forName(beanPath).newInstance();//
}catch (Exception e){
e.printStackTrace();
}
return bean;
}
}
단일 모드
public class BeanFactory {
// Properties
private static Properties props;
// Map, 。
private static Map beans;
// Properties
static {
try {
//
props = new Properties();
// properties
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
props.load(in);
//
beans = new HashMap();
// Key
Enumeration keys = props.keys();
//
while (keys.hasMoreElements()){
// Key
String key = keys.nextElement().toString();
// key value
String beanPath = props.getProperty(key);
//
Object value = Class.forName(beanPath).newInstance();
// key value
beans.put(key,value);
}
}catch(Exception e){
throw new ExceptionInInitializerError(" properties !");
}
}
/**
* bean
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
[이미지 업로드 실패...(image-ec806-1596714253764)]
[이미지 업로드 실패...(image-b3347b-1596714253764)]
IOC
빈을 실례화하는 세 가지 방법.
첫 번째 방식: 기본 무참구조 함수 사용하기
두 번째 방식:spring 정적 공장 관리 - 정적 공장 방법으로 대상 만들기/**
정적 공장을 모의하여 업무층 구현 클래스*/public class StaticFactory {public static Iaccount Service create Account Service () {return new Account Service Impl ()}
세 번째 방식:spring관리 실례공장 - 실례공장을 사용하는 방법으로 대상 만들기/**
하나의 실례 공장을 모의하여 업무층 실현 클래스*이 공장 창설 대상을 만들려면 기존 공장 실례 대상을 호출하고 방법*/public class Instance Factory {public Iaccount Service create Account Service () {return new Account Service Impl ()}
DI
의존 주입의 개념
종속 주입: Dependency Injection.이것은spring 프레임워크의 핵심 ioc의 구체적인 실현이다.우리의 프로그램은 작성할 때 반전을 제어하여 대상의 생성을spring에 맡기지만 코드에 의존하지 않는 상황이 발생할 수 없습니다.ioc 결합은 그들의 의존 관계를 낮출 뿐이지 해소되지는 않는다.예를 들어 우리의 업무층은 여전히 지구층의 방법을 사용할 것이다.그러면 이런 업무층과 지구층의 의존 관계는 스프링을 사용한 후에 스프링이 유지하게 된다.간단하게 말하면, 앉아서 구조가 지구층의 대상을 업무층에 전달하고, 우리가 직접 얻지 않아도 된다는 것이다.
구조 함수 주입은 말 그대로 클래스의 구조 함수를 사용하여 구성원 변수에 값을 부여하는 것이다.값을 부여하는 작업은 우리가 하는 것이 아니라 스프링 프레임워크를 설정해서 주입하는 것입니다.
public class AccountServiceImpl implements IAccountService {
private String name;
private Integer age;
private Date birthday;
public AccountServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println(name+","+age+","+birthday);
}
}
set 메소드 주입
말 그대로 클래스에 구성원을 주입해야 하는 set 방법을 제공합니다
public class AccountServiceImpl implements IAccountService {
private String name;
private Integer age;
private Date birthday;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println(name+","+age+","+birthday);
}
}
주입 집합 속성
말하자면 클래스의 집합 구성원에게 값을 전달하는 것이다. 이것은 set 방법으로 주입하는 방식을 사용하지만 변수의 데이터 형식은 모두 집합이다.
public class AccountServiceImpl implements IAccountService {
private String[] myStrs;
private List myList;
private Set mySet;
private Map myMap;
private Properties myProps;
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List myList) {
this.myList = myList;
}
public void setMySet(Set mySet) {
this.mySet = mySet;
}
public void setMyMap(Map myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveAccount() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC
aaa
bbb
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.